Submission #99319

#TimeUsernameProblemLanguageResultExecution timeMemory
99319TadijaSebezArranging Tickets (JOI17_arranging_tickets)C++11
10 / 100
1712 ms504 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=200050;
const int M=2*N;
const int inf=1e9+7;
int ls[M],rs[M],tsz,root,lzy[M],mx[M];
void Add(int &c, int ss, int se, int qs, int qe, int f)
{
	if(qs>qe || qs>se || ss>qe) return;
	if(!c) c=++tsz;
	if(qs<=ss && qe>=se){ lzy[c]+=f;mx[c]+=f;return;}
	int mid=ss+se>>1;
	Add(ls[c],ss,mid,qs,qe,f);
	Add(rs[c],mid+1,se,qs,qe,f);
	mx[c]=max(mx[ls[c]],mx[rs[c]])+lzy[c];
}
int Get(int c, int ss, int se, int qs, int qe)
{
	if(qs>qe || qs>se || ss>qe) return -inf;
	if(qs<=ss && qe>=se) return mx[c];
	int mid=ss+se>>1;
	return max(Get(ls[c],ss,mid,qs,qe),Get(rs[c],mid+1,se,qs,qe))+lzy[c];
}
void init()
{
	for(int i=1;i<=tsz;i++) ls[i]=rs[i]=lzy[i]=mx[i]=0;
	tsz=root=0;
}
int a[N],b[N],c[N],n,m;
ll Solve()
{
	init();
	int i;
	ll ans=0;
	for(i=1;i<=m;i++)
	{
		ans+=c[i]/2;
		if(a[i]>b[i]) swap(a[i],b[i]);
		if(c[i]&1) Add(root,1,n,a[i],b[i]-1,1);
	}
	for(i=1;i<=m;i++) if(c[i]&1)
	{
		int pre=mx[root],nxt=max(Get(root,1,n,1,a[i]-1),Get(root,1,n,b[i],n))+1;
		if(pre>nxt) Add(root,1,n,1,n,1),Add(root,1,n,a[i],b[i]-1,-2);
	}
	ans+=mx[root];
	return ans;
}
ll Brute()
{
	ll sum=0,ans=inf;
	for(int i=1;i<=m;i++){ if(a[i]>b[i]) swap(a[i],b[i]);sum+=c[i]/2;}
	for(int mask=0;mask<(1<<m);mask++)
	{
		init();
		for(int i=1;i<=m;i++) if(c[i]&1)
		{
			if((mask>>(i-1))&1)
			{
				Add(root,1,n,a[i],b[i]-1,1);
			}
			else
			{
				Add(root,1,n,1,n,1);
				Add(root,1,n,a[i],b[i]-1,-1);
			}
		}
		ans=min(ans,(ll)mx[root]);
	}
	return sum+ans;
}
void input()
{
	scanf("%i %i",&n,&m);
	for(int i=1;i<=m;i++) scanf("%i %i %i",&a[i],&b[i],&c[i]);
}
void Test()
{
    srand(time(0));
    int t=10000;
    for(int i=1;i<=t;i++)
	{
		n=rand()%3+2;
		m=rand()%5+1;
		for(int j=1;j<=m;j++)
		{
			do
			{
				a[j]=rand()%n+1;
				b[j]=rand()%n+1;
			}while(a[j]==b[j]);
			c[j]=rand()%100+1;
		}
		ll sol=Solve();
		ll bru=Brute();
		if(sol!=bru)
		{
			printf("%i %i\n",n,m);
			for(int j=1;j<=m;j++) printf("%i %i %i\n",a[j],b[j],c[j]);
			printf("Solve: %lld\n",sol);
			printf("Brute: %lld\n",bru);
			return;
		}
		printf("%i OK\n",i);
	}
}
int main()
{
	//Test();
	input();
	printf("%lld\n",Brute());
	return 0;
}

Compilation message (stderr)

arranging_tickets.cpp: In function 'void input()':
arranging_tickets.cpp:75:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%i %i",&n,&m);
  ~~~~~^~~~~~~~~~~~~~~
arranging_tickets.cpp:76:29: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=1;i<=m;i++) scanf("%i %i %i",&a[i],&b[i],&c[i]);
                        ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...