zoukankan      html  css  js  c++  java
  • AtCoder Grand Contest 038

    这场AGC我竟然会四题,吓傻了

    然后仔细一看发现BCD都是700pts的……果然我还是naive

    E题好像还是不会= =

    (f A - 01 Matrix)

    (f Solution):直接贴代码(因为太浅显了0_0)

    #include<bits/stdc++.h>
    #define ll long long
    #define fr(i,x,y) for(int i=(x);i<=(y);i++)
    #define rf(i,x,y) for(int i=(x);i>=(y);i--)
    #define frl(i,x,y) for(int i=(x);i<(y);i++)
    using namespace std;
    const int N=2002;
    int n,m,A,B;
    
    int main(){
    	cin>>n>>m>>A>>B;
    	fr(i,1,n){
    		fr(j,1,m)
    		 printf("%d",(i<=B)^(j<=A));
    		puts("");
    	}
    	return 0;
    }
    

    (f B- Sorting a Segment)

    (f Description):给你一个长度为 (n) 的排列,一次操作可以选择连续 (k) 个进行排序,问一次操作后有多少种可能排列。

    (f Solution):首先显然一段区间递增的话排序后不变,所以先把这样的区间踢掉。然后我们考虑选择 ([i,i+k-1])([i+1,i+k]) 这两个区间操作后,如果获得的排列是一样的话,那么显然 (P_i)([i,i+k-1]) 的最小值,(P_{i+k})([i+1,i+k]) 的最大值,用单调队列预处理滑动窗口最值就好了……当然想写线段树或者ST表什么的也阔以0_0

    #include<bits/stdc++.h>
    #define ll long long
    #define fr(i,x,y) for(int i=(x);i<=(y);i++)
    #define rf(i,x,y) for(int i=(x);i>=(y);i--)
    #define frl(i,x,y) for(int i=(x);i<(y);i++)
    using namespace std;
    const int N=200002;
    int n,K,a[N];
    int h[N],t,w;
    int mn[N],mx[N];
    
    void read(int &x){
    	char ch=getchar();x=0;
    	for(;ch<'0'||ch>'9';ch=getchar());
    	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
    }
    
    void push(int x,bool (*cmp)(int,int)){
    	while(w>=t&&cmp(a[h[w]],a[x])) w--;
    	h[++w]=x;
    }
    
    int find(int x){
    	while(h[t]<=x-K) t++;
    	return a[h[t]];
    }
    
    bool big(int x,int y){ return x>y; }
    bool small(int x,int y){ return x<y; }
    
    void init(){
    	t=1;w=0;
    	fr(i,1,n){
    		push(i,big);
    		mn[i]=find(i);
    	}
    	t=1;w=0;
    	fr(i,1,n){
    		push(i,small);
    		mx[i]=find(i);
    	}
    }
    
    int main(){
    	read(n);read(K);
    	fr(i,1,n) read(a[i]);
    	init();
    	int flag=0;
    	fr(i,2,K) if (a[i-1]>a[i]) flag++;
    	int bo=0,ans=0;
    	fr(i,K,n){
    		if (flag==0) bo=1;
    		 else{
    		 	if (i==K||a[i-K]!=mn[i-1]||a[i]!=mx[i]) ans++;
    		 }
    		flag-=a[i-K+1]>a[i-K+2];
    		flag+=a[i]>a[i+1];
    	}
    	cout<<ans+bo<<endl;
    	return 0;
    }
    

    (f C-LCMs)

    (f Description):求 (sum_{i=1}^{N-1} sum_{j=i+1}^{N} lcm(A_i,A_j))

    (f Solution):看起来不太新鲜的题……

    莫比乌斯反演……

    题目是有序对,转成无序对会比较好求,并且要把所有数存到一个桶 (s)

    (g(x)=(sum_{i=1}^{M/x} s_{xi} cdot xi)^2)(M) 是值域)

    然后给 (g) 反演一下变成 (f) ,这里用的是第二种莫比乌斯反演:若(g(n)=sum_{n|d}f(d)),则(f(n)=sum_{n|d}mu(d/n)g(d))

    然后答案显然是 (sum_{i=1}^M frac{f(i)}{i})

    啊感性理解

    #include<bits/stdc++.h>
    #define ll long long
    #define fr(i,x,y) for(int i=(x);i<=(y);i++)
    #define rf(i,x,y) for(int i=(x);i>=(y);i--)
    #define frl(i,x,y) for(int i=(x);i<(y);i++)
    using namespace std;
    const int N=200002;
    const int M=1000002;
    const int p=998244353;
    const int inv2=(p+1)/2;
    int n,a[N],s[M];
    int mu[M];
    ll sum[M],f[M];
    
    void read(int &x){
    	char ch=getchar();x=0;
    	for(;ch<'0'||ch>'9';ch=getchar());
    	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
    }
    
    void Add(ll &x,ll y){
    	x+=y;
    	while(x>=p) x-=p;
    	while(x<0) x+=p;
    }
    
    int b[M],pri[M],L;
    void init(){
    	mu[1]=1;
    	frl(i,2,M){
    		if (!b[i]) pri[++L]=i,mu[i]=-1;
    		for(int j=1;j<=L&&i*pri[j]<M;j++){
    			b[i*pri[j]]=1;
    			if (i%pri[j]==0) break;
    			 else mu[i*pri[j]]=-mu[i];
    		}
    	}
    }
    
    ll qpow(ll sum,ll n){
    	ll ans=1;
    	for(;n;n>>=1,sum=sum*sum%p) if (n&1) ans=ans*sum%p;
    	return ans;
    }
    
    int main(){
    	read(n);
    	fr(i,1,n) read(a[i]),s[a[i]]++;
    	init();
    	frl(i,1,M){
    		for(int j=i;j<M;j+=i)
    		 Add(sum[i],1LL*s[j]*j);
    		sum[i]=sum[i]*sum[i]%p;
    	}
    	frl(i,1,M){
    		for(int j=i;j<M;j+=i)
    		 Add(f[i],sum[j]*mu[j/i]);
    	}
    	ll ans=0;
    	frl(i,1,M){
    		if (f[i]) Add(ans,f[i]*qpow(i,p-2)%p);
    	}
    	fr(i,1,n) Add(ans,-a[i]);
    	cout<<ans*inv2%p<<endl;
    	return 0;
    }
    

    (f D-Unique Path)

    (f Description):有一张 (n) 个点 (m) 条边的联通图,告诉你某些点对之间只有一条简单路径,某些有两条,问这样的图是否存在。

    (f Solution):首先发现一张图里,除了那些看起来在一棵树上的点之间只有一条路,其他都有多条。。这启发我们对于所有 (C_i=0) 的边维护一下连通性,在一个联通块里就表示在一棵看起来像树的东西上面(可能有些结点上会挂很多圈圈)。如果有 (C_i=1) 的边连接的两个点在同一个联通块里那显然是不行的。然后假如现在有 (cnt) 个联通块,我们发现最多还可以连 (cnt(cnt-1)/2) 条边,所以如果边数多与 (n-cnt+cnt(cnt-1)/2) 那肯定不行。然后还有就是如果只有一或俩联通块但是有 (C_i=1) 的边那也不行。如果有 (C_i=1) 的边那就起码有 (n) 条边,所以如果只有 (n-1) 条也不行。。

    细节好多,我爆了5发才过= =都要怀疑是不是又胡假算法惹0_0

    #include<bits/stdc++.h>
    #define ll long long
    #define fr(i,x,y) for(int i=(x);i<=(y);i++)
    #define rf(i,x,y) for(int i=(x);i>=(y);i--)
    #define frl(i,x,y) for(int i=(x);i<(y);i++)
    using namespace std;
    const int N=200002;
    int n,Q;
    ll m;
    struct data{
    	int x,y,w;
    	bool operator < (const data &q)const{ return w<q.w; }
    }a[N];
    int f[N];
    
    template<class T> void read(T &x){
    	char ch=getchar();x=0;
    	for(;ch<'0'||ch>'9';ch=getchar());
    	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
    }
    
    int gf(int x){ return f[x]==x?x:f[x]=gf(f[x]); }
    
    int main(){
    	read(n);read(m);read(Q);
    	fr(i,1,Q) read(a[i].x),read(a[i].y),read(a[i].w);
    	fr(i,1,Q) a[i].x++,a[i].y++;
    	sort(a+1,a+1+Q);
    	fr(i,1,n) f[i]=i;
    	int flag=0;
    	fr(i,1,Q){
    		if (a[i].w){
    			flag=i;
    			break;
    		}
    		int x=a[i].x,y=a[i].y;
    		f[gf(x)]=gf(y);
    	}
    	if (flag) fr(i,flag,Q) if (gf(a[i].x)==gf(a[i].y)) return puts("No"),0;
    	int cnt=0;
    	fr(i,1,n) if (gf(i)==i) cnt++;
    	if (!flag){
    		if (m>1LL*cnt*(cnt-1)/2+n-cnt) puts("No");
    		 else puts("Yes");
    	} else{
    		if (cnt<=2||m<n) puts("No");
    		 else if (m>1LL*cnt*(cnt-1)/2+n-cnt) puts("No");
    		  else puts("Yes");
    	}
    	return 0;
    }
    
  • 相关阅读:
    HDU 1874 畅通工程续(dijkstra)
    HDU 2112 HDU Today (map函数,dijkstra最短路径)
    HDU 2680 Choose the best route(dijkstra)
    HDU 2066 一个人的旅行(最短路径,dijkstra)
    关于测评机,编译器,我有些话想说
    测评机的优化问题 时间控制
    CF Round410 D. Mike and distribution
    数字三角形2 (取模)
    CF Round410 C. Mike and gcd problem
    CF Round 423 D. High Load 星图(最优最简构建)
  • 原文地址:https://www.cnblogs.com/ymzqwq/p/11681521.html
Copyright © 2011-2022 走看看