您的位置:首页 > 其它

10.15考试总结

2017-10-18 19:34 260 查看
1.数列的价值(100/100)

     题目大意:给一个数组a,他的价值为其中每个数的异或和,求删掉一个数后最大异或和;

     感想:o(n)扫一遍,因为a^b^b=a,所以直接用开始时数列价值异或每个数看哪个最大。# include <iostream>
# include <cstdio>
# include <cstring>
# include <algorithm>
# include <queue>
# include <cmath>
# include <map>
# include <cctype>
# include <string>
using namespace std;
typedef long long ll;
ll Read()
{
ll i=0,f=1;char c=getchar();
while(c>'9'||c<'0') {if(c=='-') f=-1; c=getchar();}
while(c>='0'&&c<='9') {i=i*10+(c-'0'); c=getchar();}
return i*f;
}
int n,w,a[1000005];
int main()
{
n=Read();
for(int i=1;i<=n;++i)
{
a[i]=Read();
if(i>1) w=w^a[i];
else w=a[i];
}
int ans=0;
for(int i=1;i<=n;++i)
{
ans=max(ans,w^a[i]);
}
cout<<ans<<endl;
}2.图(60/100)
    题目大意:给一张无向图,要求满足(x,y)的对数,(x,y)满足点z(z!=x,z!=y),要么z与x,y都有边,要么都没有;

    感想:读一遍题,好的没懂,再读一遍,还是没懂,于是问了下dalao,大意是与x,y的点都相同,那就很好做了。随机赋给每个点值,求出每个点与其周围点异或和,然后排序,类似去重算出异或和相同的点对数。还要注意若x,y有边,则上面做法是无法求出的,于是再与自己异或一遍,再重复算一遍。无疑两种计算是不会重复的,因为重新异或自己后原本相等的点就不等了,自然不会计算。(最后友情提示,随机数别乱赋,否则会死的很惨,别问我问什么)

# include <iostream>
# include <cstdio>
# include <cstring>
# include <algorithm>
# include <queue>
# include <cmath>
# include <map>
# include <cctype>
# include <string>
# include <ctime>
using namespace std;
typedef long long ll;
ll Read()
{
ll i=0,f=1;char c=getchar();
while(c>'9'||c<'0') {if(c=='-') f=-1; c=getchar();}
while(c>='0'&&c<='9') {i=i*10+(c-'0'); c=getchar();}
return i*f;
}
ll a[1000005],b[1000005],v[1000005],n,m,x,y,r;
int main()
{

srand(64643645);
n=Read(),m=Read();
for(int i=1;i<=n;++i)
v[i]=r=r*233+17;
for(int i=1;i<=m;++i)
{
x=Read(),y=Read();
a[x]^=v[y],a[y]^=v[x];
}
for(int i=1;i<=n;i++) b[i]=a[i];
sort(b+1,b+n+1);
ll j=1,ans=0;
for(int i=1;i<=n;++i)
{
if(b[i]!=b[j]) ans+=(i-j)*(i-j-1)/2,j=i;

}
ans+=(n-j)*(n-j+1)/2;j=1;
for(int i=1;i<=n;++i) b[i]=a[i]^v[i];
sort(b+1,b+n+1);
for(int i=1;i<=n;++i)
{
if(b[i]!=b[j]) ans+=(i-j)*(i-j-1)/2,j=i;
}
ans+=(n-j)*(n-j+1)/2;
printf("%lld\n",ans);
}
3.树链
    题目大意:树上有m条链,每条链有一定价值,选出任意链满足任意链条之间经过的点无交集,使价值最大;

       感想:想了半天打了个暴力,不想说话。正解:树形dp+树状数组。这道题我就和谐掉吧,没有做。。代码附上,可参考。#pragma GCC optimize("O3")

#include <cstdio>
#include <cctype>
#include <algorithm>

int n, m, x, y, cnt, tot, size;
int first[100010], next[200020], to[200020], __first[100010], __next[200020], __to[200020];
int t[100010], g[100010][18], num[100010], __size[100010], d[100010], u[100010], v[100010], w[100010], f[100010];

inline int read () {
int i = 0;
char c = getchar();
while (!isdigit(c)) c = getchar();
while (isdigit(c)) i = (i << 3) + (i << 1) + c - 48, c = getchar();
return i;
}

inline void add(int x, int y) {
to[++size] = y;
next[size] = first[x];
first[x] = size;
}

inline void _add (int x, int y) {
__to[++cnt] = y;
__next[cnt] = __first[x];
__first[x] = cnt;
}

inline void __add (int x,int c) {
for (; x < 100001; x += x & -x) t[x] += c;
}

inline int query (int x) {
int ret = 0;
for (; x; x ^= x & -x) ret += t[x];
return ret;
}

void dfs (int x, int fa) {
__size[x] = 1;
num[x] = ++tot;
g[x][0] = fa;
for (int k = 0; g[x][k]; k++)
g[x][k + 1] = g[g[x][k]][k];
for (int i = first[x]; i; i = next[i])
if (to[i] ^ fa) {
d[to[i]] = d[x] + 1;
dfs (to[i], x);
__size[x] += __size[to[i]];
}
}

inline int lca (int x, int y) {
if (d[x] < d[y]) x ^= y ^= x ^= y;
for (int i = 16; ~i; i--)
if (d[g[x][i]] >= d[y]) x = g[x][i];
if(x == y) return x;
for (int i = 16; ~i; i--)
if (g[x][i] ^ g[y][i]) {
x = g[x][i];
y = g[y][i];
}
return g[x][0];
}

void dp (int x, int fa) {
int sum = 0;
for (int i = first[x]; i; i = next[i])
if (to[i] ^ fa) {
dp (to[i], x);
sum += f[to[i]];
}
f[x] = sum;
for (int i = __first[x]; i; i = __next[i])
f[x] = std::max (f[x], sum + w[__to[i]] + query(num[u[__to[i]]]) + query(num[v[__to[i]]]));
__add(num[x], sum - f[x]);
__add(num[x] + __size[x], f[x] - sum);
}

int main () {
n = read();
m = read();
for (int i = 1; i < n; i++) {
x = read();
y = read();
add(x, y);
add(y, x);
}
dfs(d[1] = 1, 0);
for (int i = 1; i <= m; i++) {
u[i] = read();
v[i] = read();
w[i] = read();
_add (lca (u[i], v[i]), i);
}
dp (1, 0);
printf ("%d\n", f[1]);
return 0;
}
总结:周末作业还是挺爽的,本来只放半天,然后做3道题就没了。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: