又是签到的一天。。。
只会A题系列
链接:https://www.nowcoder.com/acm/contest/145/A
来源:牛客网
题意:左面一列分别为 0 ~ n-1 问你右面这一列怎么排数字使得 一一对应之后权值最小
权值是两个数字按位与的结果
开始想成了找规律。。后来队友提示按位取反。 n等于多少最好的情况权值都可以为0
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int ans[N];
int lb(int k)
{
int n = 0;
while(k > 0)
{
n ++;
k >>= 1;
}
return n;
}
int main()
{
int n;
cin >> n;
bitset<32> b;
memset(ans, -1,sizeof(ans));
for(int i = n - 1;i >= 0;i --)
{
if(ans[i] == -1)
{
b = ~i;
int len = lb(i);
int sum = 0;
int t = 1;
for(int k = 0;k < len;k ++)
{
sum += b[k] * t;
t *= 2;
}
ans[i] = sum;
ans[sum] = i;
}
}
for(int i = 0;i < n;i ++)
cout << ans[i] << " ";
return 0;
}
链接:https://www.nowcoder.com/acm/contest/145/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;
}
链接:https://www.nowcoder.com/acm/contest/145/E
来源:牛客网
#include <bits/stdc++.h>
using namespace std;
int f[1000777];
int C3(int n)
{
return (n-2)*(n-1)*n/6;
}
int C4(int n)
{
return (n-3)*(n-2)*(n-1)*n/24;
}
void print(int t,int a,int b,int c,int d,int e)
{
int m=t*(t-1)/2+a+b+c+d+e;
printf("%d %d\n",t+5,m);
for(int i=1; i<=t; i++)
for(int j=1; j<i; j++)
printf("%d %d\n",i,j);
for(int i=1; i<=a; i++) printf("%d %d\n",i,t+1);
for(int i=1; i<=b; i++) printf("%d %d\n",i,t+2);
for(int i=1; i<=c; i++) printf("%d %d\n",i,t+3);
for(int i=1; i<=d; i++) printf("%d %d\n",i,t+4);
for(int i=1; i<=e; i++) printf("%d %d\n",i,t+5);
return ;
}
int main()
{
for(int i=2; i<70; ++i) f[C3(i)]=i;
int K,t=4;
scanf("%d",&K);
while(C4(t)<=K) ++t;
--t;
t=min(t,70);
for(int i=2; i<=t; ++i) for(int j=i; j<=t; ++j) for(int k=j; k<=t; ++k) for(int l=k; l<=t; ++l)
{
int tot=C3(i)+C3(j)+C3(k)+C3(l);
if(tot+C4(t)>K) break;
tot=K-tot-C4(t);
if(f[tot])
{
print(t,i,j,k,l,f[tot]);
return 0;
}
}
}
链接:https://www.nowcoder.com/acm/contest/145/J
来源:牛客网
#include<bits/stdc++.h>
using namespace std;
#define maxn 1020
#define hsh accepted
char s[maxn];
int a[maxn][maxn];
int rig[maxn][maxn],up[maxn][maxn];
int n,m;
bool vis[55];
inline int idx(char c)
{
if(c>='A'&&c<='Z') return c-'A';
else return c-'a'+26;
}
int mn[1050];
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i)
{
scanf("%s",s);
for(int j=0;j<m;++j)
a[i][j]=idx(s[j]);
}
for(int j=0;j<m;++j)
{
for(int i=0;i<52;++i) vis[i]=0;
int now=n-1;
while(now>=0&&(!vis[a[now][j]]))
{
vis[a[now][j]]=1;
now--;
}
up[n-1][j]=now+1;
for(int i=n-2;i>=0;--i)
{
vis[a[i+1][j]]=0;
while(now>=0&&(!vis[a[now][j]]))
{
vis[a[now][j]]=1;
now--;
}
up[i][j]=now+1;
}
}
for(int i=0;i<n;++i)
{
for(int j=0;j<52;++j) vis[j]=0;
int now=0;
while(now<m&&(!vis[a[i][now]]))
{
vis[a[i][now]]=1;
now++;
}
rig[i][0]=now-1;
for(int j=1;j<m;++j)
{
vis[a[i][j-1]]=0;
while(now<m&&(!vis[a[i][now]]))
{
vis[a[i][now]]=1;
now++;
}
rig[i][j]=now-1;
}
}
long long ans=0;
for(int i=0;i<n;++i)
for(int j=0;j<m;++j)
{
int now=up[i][j];
mn[i]=rig[i][j];
for(int k=i-1;k>=now;--k) mn[k]=min(mn[k+1],rig[k][j]);
ans+=i-now+1;
for(int k=j+1;k<=rig[i][j];++k)
{
while(now<i&&(up[i][k]>now||mn[now]<k)) now++;
ans+=i-now+1;
}
}
printf("%lld\n",ans);
return 0;
}