zscoder场
A
签到
#include<bits/stdc++.h>
using namespace std;
int n,p[500000];
void find(int n){
if(n<0) return;
int x=1;
while(x<=n)
x<<=1;
for(int i=n; i>=(x>>1); i--){
p[i]=x-1-i;
p[x-1-i]=i;
}
find(x-1-n-1);
return;
}
int main(){
scanf("%d",&n);
find(n-1);
for(int i=0; i<n; i++){
printf("%d%c",p[i],i==n-1?'\n':' ');
}
return 0;
}
C
暴力
#include <bits/stdc++.h>
using namespace std;
unordered_map<string,int>mp[20];
string s;
string t;
int main(){
int n;
cin>>n>>s;
mp[0][s]=1;
for(int i=1;i<=n;i++){
for(auto it=mp[i-1].begin();it!=mp[i-1].end();it++){
s=it->first;
t="";
int len=(1<<(n+1-i));
for(int j=0;j<len;j+=2){
t+=((s[j]-'0')|(s[j+1]-'0'))+'0';
}
mp[i][t]+=it->second;
t="";
for(int j=0;j<len;j+=2){
t+=((s[j]-'0')&(s[j+1]-'0'))+'0';
}
mp[i][t]+=it->second;
t="";
for(int j=0;j<len;j+=2){
t+=((s[j]-'0')^(s[j+1]-'0'))+'0';
}
mp[i][t]+=it->second;
}
}
cout<<mp[n]["1"]<<endl;
//cout << "Totle Time : " << (double)clock() /CLOCKS_PER_SEC<< "s" << endl;
}
E
据说可以留五个点背包,比赛的时候不知道写的什么东西
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int k,n=0,m=0;
int u[10000],v[10000];
int c4[76]={0,0,0,0,1};
int c3[76]={0,0,0,1};
int c2[76]={0,0,1};
bool vis[70000];
int numa[70000],numb[70000],numc[70000];
void init(){
for(int i=5; i<=75; i++){
c4[i]=c4[i-1]*i/(i-4);
}
for(int i=4; i<=75; i++){
c3[i]=c3[i-1]*i/(i-3);
}
for(int i=3; i<=75; i++){
c2[i]=c2[i-1]*i/(i-2);
}
/*
for(int i=1; i<=75; i++){
cout<<i<<": "<<c2[i]<<" "<<c3[i]<<" "<<c4[i]<<endl;
}
*/
}
int main(){
init();
scanf("%d",&k);
int t4=75;
while(c4[t4]>k) t4--;
for(int i=1; i<=t4; i++){
for(int j=i+1; j<=t4; j++){
m++;
u[m]=i;
v[m]=j;
}
}
n=t4+4;
k-=c4[t4];
int tmp=0;
memset(vis,0,sizeof(vis));
for(int a=0; a<=t4; a++){
tmp+=c3[a];
if(tmp<=k)
for(int b=0; b<=t4; b++){
tmp+=c3[b];
if(tmp<=k)
for(int c=max(0,a+b-t4); c<=min(a,b); c++){
tmp+=c2[c];
if(tmp<=k && !vis[tmp]){
vis[tmp]=1;
numa[tmp]=a;
numb[tmp]=b;
numc[tmp]=c;
}
tmp-=c2[c];
}
tmp-=c3[b];
}
tmp-=c3[a];
}
//cout<<"haha"<<endl;
for(int i=0; i<=k; i++){
if(vis[i] && vis[k-i]){
int a=numa[i],b=numb[i],c=numc[i];
for(int j=1; j<=a; j++){
m++;
u[m]=j;
v[m]=t4+1;
}
for(int j=a+1-c; j<=a+b-c; j++){
m++;
u[m]=j;
v[m]=t4+2;
}
m++;
u[m]=t4+1;
v[m]=t4+2;
a=numa[k-i],b=numb[k-i],c=numc[k-i];
for(int j=1; j<=a; j++){
m++;
u[m]=j;
v[m]=t4+3;
}
for(int j=a+1-c; j<=a+b-c; j++){
m++;
u[m]=j;
v[m]=t4+4;
}
m++;
u[m]=t4+3;
v[m]=t4+4;
break;
}
}
printf("%d %d\n",n,m);
for(int i=1; i<=m; i++){
printf("%d %d\n",u[i],v[i]);
}
//cout<<"hehe"<<endl;
return 0;
}
J
随便dp下
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1010;
char s[N][N];
int n,m;
int pos[200],lmax[N][N],umax[N][N];
ll ans;
int len[60];
void init(){
ans=0;
for(int i=1; i<=n; i++){
memset(pos,0,sizeof(pos));
for(int j=1; j<=m; j++){
lmax[i][j]=min(lmax[i][j-1]+1,j-pos[s[i][j]]);
pos[s[i][j]]=j;
}
}
for(int j=1; j<=m; j++){
memset(pos,0,sizeof(pos));
for(int i=1; i<=n; i++){
umax[i][j]=min(umax[i-1][j]+1,i-pos[s[i][j]]);
pos[s[i][j]]=i;
}
}
for(int r=1; r<=m; r++){
memset(len,0,sizeof(len));
for(int d=1; d<=n; d++){
for(int i=0; i<lmax[d][r]; i++){
len[i]=min(len[i]+1,umax[d][r-i]);
if(i)
len[i]=min(len[i],len[i-1]);
ans+=len[i];
}
for(int i=lmax[d][r]; i<=54; i++)
len[i]=0;
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++){
scanf("%s",s[i]+1);
}
init();
printf("%lld\n",ans);
return 0;
}