Codeforces Round #789 (Div. 2)

Tokitsukaze and Strange Inequality
注:用数组计数一下会更快 本人用log了

#include <iostream>  
#include <stdio.h>  
#include <string.h>   
#include <stack>  
#include <queue>   
#include <map>  
#include <set>  
#include <vector>  
#include <math.h>  
#include <bitset>  
#include <algorithm>  
#include <climits>
using namespace std;
#define ll long long 
// #define int long long
const int N=5e3+10;
const int mod= 998244353;
int t,n,p[N];
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&p[i]);
		ll res=0;
		for(int i=2;i<=n;i++){
			vector<int> v;for(int j=1;j<i;j++) v.push_back(p[j]);
			sort(v.begin(),v.end());
			ll res2=0;for(int j=i+2;j<=n;j++) res2+=(p[j]<p[i]);
			for(int j=i+1;j<n;j++){
				if(j!=i+1) res2-=(p[j]<p[i]);
				ll res1=lower_bound(v.begin(),v.end(),p[j])-v.begin();
				res+=res1*res2;
			}
		}
		cout<<res<<endl;
	}
}

D. Tokitsukaze and Meeting

#include <iostream>  
#include <stdio.h>  
#include <string.h>   
#include <stack>  
#include <queue>   
#include <map>  
#include <set>  
#include <vector>  
#include <math.h>  
#include <bitset>  
#include <algorithm>  
using namespace std;
const int N=1e6+10;
int t,n,m;
int ans[N],row[N],pre[N],pre2[N];
char ch[N];
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m); cin>>ch+1;
        
        for(int i=1;i<=n*m;i++){
            pre[i]=pre[i-1]+ch[i]-'0';
            ans[i]=row[i%m]=pre2[i]=0;
        }
        for(int i=1;i<=n*m;i++){
            int l=max(1,i-m+1);
            pre2[i]=(pre[i]-pre[l-1]>0?1:0)+pre2[l-1];
        }

        int cnt=0;
        for(int i=1;i<=n*m;i++){
			// cout<<row[i%m]<<" "<<ch[i]<<endl;
            if(row[i%m]==0&&ch[i]=='1') row[i%m]=1,++cnt;
            ans[i]=cnt;
        }
        for(int i=1;i<=n*m;i++){
            ans[i]+=pre2[i]; 
        }
        for(int i=1;i<=n*m;i++) cout<<ans[i]<<" ";cout<<endl;
   }    
}

B2 - Tokitsukaze and Good 01-String (hard version)

#include <iostream>  
#include <stdio.h>  
#include <string.h>   
#include <stack>  
#include <queue>   
#include <map>  
#include <set>  
#include <vector>  
#include <math.h>  
#include <bitset>  
#include <algorithm>  
#include <climits>
using namespace std;
#define ll long long 
// #define int long long
const int N=2e5+10;
const int mod= 998244353;
int t,n;char ch[N];
int a[N];
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%s",&n,ch+1);
		vector<int> v;
		int res1=0,res2=1;
		for(int i=1;i<=n;i+=2){
			if(ch[i]!=ch[i+1]) ++res1,a[i]=a[i+1]=2;
			else a[i+1]=a[i]=ch[i]-'0';
		}
		int pre=(a[1]==2?-1:a[1]);
		for(int i=2;i<=n;i++){
			if(a[i]==2) continue;
			if(a[i]!=pre&&pre!=-1) ++res2,pre=a[i];
			if(pre==-1) pre=a[i];
		}
		cout<<res1<<" "<<res2<<endl;
	}
}

E. Tokitsukaze and Two Colorful Tapes

#include <iostream>  
#include <stdio.h>  
#include <string.h>   
#include <stack>  
#include <queue>   
#include <map>  
#include <set>  
#include <vector>  
#include <math.h>  
#include <bitset>  
#include <algorithm>  
using namespace std;
const int N=1e6+10;
int t,n,a[N],b[N],fa[N];
int find(int x){
	if(fa[x]==x) return x;
	else return fa[x]=find(fa[x]);
}
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		for(int i=1;i<=n;i++) scanf("%d",&b[i]);
		for(int i=1;i<=n;i++) fa[i]=i;
		for(int i=1;i<=n;i++){
			int fx=find(a[i]),fy=find(b[i]);
			if(fx!=fy) fa[fx]=fy;
		}
		map<int,int> mp;
		for(int i=1;i<=n;i++) mp[find(i)]++;
		int cnt=0;
		for(auto it:mp){cnt+=it.second/2;}
		long long  res=0;
		for(int i=1;i<=cnt;i++) res-=i;
		for(int i=n-cnt+1;i<=n;i++) res+=i;
		cout<<res*2<<endl;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值