CF981A Antipalindrome(字符串+模拟)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100
int n;
char s[N];
inline bool jud(int l,int r){
for(int i=l,j=r;i<=j;i++,j--) if(s[i]!=s[j]) return 0;return 1;
}
int main(){
// freopen("a.in","r",stdin);
scanf("%s",s+1);n=strlen(s+1);
for(int i=n;i>=2;--i)
for(int j=1;j<=n;++j){
if(j+i-1>n) break;
if(!jud(j,j+i-1)){printf("%d\n",i);return 0;}
}
puts("0");
return 0;
}
CF981B Businessmen Problems(map)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100010
inline char gc(){
static char buf[1<<16],*S,*T;
if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
return *S++;
}
inline int read(){
int x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
return x*f;
}
int n,m;ll ans=0;
map<int,int>mp;
int main(){
// freopen("a.in","r",stdin);
n=read();
for(int i=1;i<=n;++i){
int x=read(),y=read();mp[x]=y;
}m=read();
for(int i=1;i<=m;++i){
int x=read(),y=read();
if(mp[x]) mp[x]=max(mp[x],y);
else mp[x]=y;
}map<int,int>::iterator it=mp.begin();
while(it!=mp.end()){
ans+=it->second;++it;
}printf("%lld\n",ans);
return 0;
}
CF981C Useful Decomposition(树+模拟)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100010
inline char gc(){
static char buf[1<<16],*S,*T;
if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
return *S++;
}
inline int read(){
int x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
return x*f;
}
int n,du[N],cnt=0,x;
int main(){
// freopen("a.in","r",stdin);
n=read();
for(int i=1;i<n;++i){
int x=read(),y=read();
du[x]++;du[y]++;
}for(int i=1;i<=n;++i) if(du[i]>2) ++cnt,x=i;
if(cnt>1){puts("No");return 0;}puts("Yes");
if(cnt==0){
for(int i=1;i<=n;++i) if(du[i]==1) x=i;puts("1");
for(int i=1;i<=n;++i) if(du[i]==1){printf("%d %d\n",i,x);return 0;}
}cnt=0;for(int i=1;i<=n;++i) if(du[i]==1) ++cnt;
printf("%d\n",cnt);
for(int i=1;i<=n;++i) if(du[i]==1) printf("%d %d\n",x,i);
return 0;
}
CF981D Bookshelves(按位贪心+dp)
把n个正整数分成恰好k部分,使得每部分的和按位与起来最大。
从高往低按位贪心,f[i][j]表示前i位分j部分能否满足。
复杂度O(n4)O(n4)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100
inline char gc(){
static char buf[1<<16],*S,*T;
if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
return *S++;
}
inline ll read(){
ll x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
return x*f;
}
int n,K;
ll a[N],sum[N],bin[N],ans=0;
bool f[N][N];
int main(){
// freopen("a.in","r",stdin);
n=read();K=read();bin[0]=1;
for(int i=1;i<=n;++i) a[i]=read(),sum[i]=sum[i-1]+a[i];
for(int i=1;i<60;++i) bin[i]=bin[i-1]<<1;
for(int ii=59;ii>=0;--ii){
ans|=bin[ii];memset(f,0,sizeof(f));
for(int i=1;i<=n;++i) f[i][1]=((sum[i]&ans)==ans);
for(int j=2;j<=K;++j)
for(int i=j;i<=n;++i)
for(int k=j-1;k<i;++k){
if(((sum[i]-sum[k])&ans)!=ans) continue;
f[i][j]|=f[k][j-1];
}
if(!f[n][K]) ans^=bin[ii];
}printf("%I64d\n",ans);
return 0;
}
CF981E Addition on Segments(bitset+线段树)
有n个数,一开始均为0,给定m个区间加操作。
你可以任选一个操作的子集来操作,最后能得到的最大值有多少种呢?(1~n以内)
就是维护区间内的不同数。可以线段树+bitset来暴力搞。
但是不好下放,注意到操作之间的顺序是无所谓的,于是我们把操作都离线到每个节点上,最后从下往上做一遍。
复杂度O(nlognn/32)O(nlognn/32)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 10010
inline char gc(){
static char buf[1<<16],*S,*T;
if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
return *S++;
}
inline int read(){
int x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
return x*f;
}
int n,m;
struct node{
vector<int>a;
bitset<10001>b;
}tr[N<<2];
inline void change(int p,int l,int r,int x,int y,int val){
if(x<=l&&r<=y){tr[p].a.push_back(val);return;}
int mid=l+r>>1;
if(x<=mid) change(p<<1,l,mid,x,y,val);
if(y>mid) change(p<<1|1,mid+1,r,x,y,val);
}
void dfs(int p,int l,int r){
tr[p].b[0]=1;
if(l!=r){
int mid=l+r>>1;dfs(p<<1,l,mid);dfs(p<<1|1,mid+1,r);
tr[p].b=tr[p<<1].b|tr[p<<1|1].b;
}for(int i=0;i<tr[p].a.size();++i){
int x=tr[p].a[i];
tr[p].b|=tr[p].b<<x;
}
}
int main(){
// freopen("a.in","r",stdin);
n=read();m=read();
while(m--){
int x=read(),y=read(),val=read();
change(1,1,n,x,y,val);
}dfs(1,1,n);int ans=0;
for(int i=1;i<=n;++i) if(tr[1].b[i]) ++ans;
printf("%d\n",ans);
for(int i=1;i<=n;++i) if(tr[1].b[i]) printf("%d ",i);puts("");
return 0;
}