Codeforces 742B Arpa’s obvious problem and Mehrdad’s terrible solution(map水题)
一直打算每一个位来考虑。。
结果居然一个map,什么的遍历就可以了。。
题意: 给出含有n个数的数组a[]。 问在数组中有多少对 ai^aj == x ?
自己写的又不知道为什么挂了,贴别人的。
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
const int maxn = 1e5+10;
typedef long long LL;
LL a[maxn];
int main()
{
LL n,x;
while(scanf("%lld%lld",&n,&x)!=EOF)
{
map<LL,LL> mp;
for(int i=0;i<n;++i)
{
scanf("%lld",&a[i]);
mp[a[i]]++;
}
LL ans=0;
for(int i=0;i<n;++i)
{
LL cnt=x^a[i];
if(cnt!=a[i])
ans+=mp[cnt];
else
ans+=mp[cnt]-1;
}
printf("%lld\n",ans/2);
}
return 0;
}
——————————————————————————————————————————————
参考http://www.cnblogs.com/huangzhihao/p/6141729.html
C. Arpa’s loud Owf and Mehrdad’s evil plan
题意:
有n(1<=n<=100)个人,编号1到n,每个人有一个数字crush_i(1<=crush_i<=n),有一个游戏规则如下,假设从编号为x的人开始一轮游戏,他对着编号为crush_x的人喊:“Owww…wwf。”(w重复t次),如果t大于1的话,编号为crush_x的人对着编号为crush_crush_x的人喊:“Owwww…wwwf。”(w重复t-1次)。这样一直持续下去,直到有个人收到“Owf”(w只重复1次),那么这个人就是这一轮游戏的Joon-Joon。要求解最小的t(t大于等于1),使得对于每个人x,他的Joon-Joon为y的话,那么y的Joon-Joon也为x。如果找不到这样的t,就输出-1。注意:可以自己朝自己喊话。
没有分析到长度》2的时候的t可以减半。。。
int in[N];
int cnt;
int vis[N];
int n;
int len[N];
int a[N];
LL gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
LL lcm(int a,int b){
return a/gcd(a,b)*b;
}
void dfs(int x,int l){
vis[x]=1;
len[cnt]=l;
if(!vis[a[x]])dfs(a[x],l+1);
}
int main(){
sf("%d",&n);
rep(i,1,n)sf("%d",&a[i]),in[a[i]]++;
rep(i,1,n){
if(in[i]!=1){puts("-1");return 0;}
}
cnt=0;
rep(i,1,n){
if(!vis[i])++cnt,dfs(i,1);
}
int ans=1;
for(int i=1;i<=cnt;++i){
//pf("%d\n",len[i]);
if(len[i]<=2)continue;
else{
if(len[i]%2==0){ ans=lcm(ans,len[i]/2); }
else{ ans=lcm(ans,len[i]); }
}
//pf("%d\n",ans);
}
pf("%d\n",ans);
}
————————————————————————————————————————
Codeforces724D. Arpa’s weak amphitheater and Mehrdad’s valuable Hoses(分组背包)
题意:
一共有n(1<=n<=1000)个hos,每个hos有对应的重量(1<=wi<=1000)和颜值(1<=bi<=10^6),其中有m(0<=m<=min(n*(n-1)/2, 10^5))对朋友,朋友关系具有传递性,现打算邀请其中的一些hos来参加party,对于同一只友谊的小船上的hos,如果打算邀请他们的话,要么只邀请一个hos,要么这艘船上所有的hos都要邀请,但是party上的重量总和w(1<=w<=1000)有限,保证邀请的hos的重量之和不超过w的前提下,使得他们的颜值的总和尽量大。求这个最优的颜值总和的数值。jk
int n,m,w;
int vis[N];
int we[N],b[N];
int fst[N],nxt[N<<1],vv[N<<1],e;
void add(int u,int v){
nxt[e]=fst[u];vv[e]=v;fst[u]=e++;
}
int tol[N],bea[N];
vector<int>has[N];
int dp[N];
int cnt;
void dfs(int u){
vis[u]=1;
tol[cnt]+=we[u];
bea[cnt]+=b[u];
has[cnt].push_back(u);
for(int i=fst[u];~i;i=nxt[i]){
int v=vv[i];
if(vis[v])continue;
dfs(v);
}
}
int main(){
//ree
mem(fst,-1);e=0;
sf("%d%d%d",&n,&m,&w);
rep(i,1,n)sf("%d",&we[i]);
rep(i,1,n)sf("%d",&b[i]);
rep(i,1,m){
int u,v;sf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
cnt=0;
rep(i,1,n){ if(!vis[i])++cnt,dfs(i); }
for(int i=1;i<=cnt;++i){
int len=has[i].size();
for(int k=w;k>=0;--k){
for(int j=0;j<len;++j){
int v=has[i][j];
if(k>=we[v]){
dp[k]=max(dp[k],dp[k-we[v]]+b[v]);
}
}
if(k>=tol[i])dp[k]=max(dp[k],dp[k-tol[i]]+bea[i]);//这个要放在这里。。
}
}
int ans=0;
for(int i=1;i<=w;++i){
ans=max(ans,dp[i]);
}
pf("%d\n",ans);
}