A.u

只涉及到区间修改可以考虑差分,然而如果每一行都差分复杂度还是过高。我们发现差分标记也是连续的(一行横着的一行斜着的),所以可以维护两个 差分的差分,扫两遍统计即可。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=2005;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,q;
ll dif1[N][N],dif2[N][N];
int main()
{
//freopen("dt.in","r",stdin);
//freopen("my.out","w",stdout);
n=read();q=read();
while(q--)
{
int r=read(),c=read(),l=read(),val=read();
dif1[r][c]+=val;dif1[r+l][c]-=val;
dif2[r][c+1]-=val;dif2[r+l][c+l+1]+=val;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dif2[i][j]+=dif2[i-1][j-1],dif1[i][j]+=dif1[i-1][j];
ll ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
dif1[i][j]+=dif1[i][j-1]+dif2[i][j],ans^=dif1[i][j];
}
cout<<ans<<endl;
return 0;
}

B.v

二进制状压一下当前场上剩余球的状态,记搜即可。记忆化状态需要手写Hash表,直接map会T飞。

另外,在本题中形如00110和0110的状态是不同的,为了区分我们可以给Hash表多加一个长度的参数,每次查询或插入时先调到相应的长度再操作。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int H=2e7+5;
struct hash_map
{
int head[19260820],nxt[H],to[H],tot;
short L[H],len;
double val[H];
double &operator [] (int key)
{
int x=1LL*key*len%19260817;
for(int i=head[x];i;i=nxt[i])
if(to[i]==key&&L[i]==len)return val[i];
nxt[++tot]=head[x];
head[x]=tot;
to[tot]=key;
L[tot]=len;
return val[tot]=-1;
}
}h;
const int N=35;
int n,K;
char s[N];
int erase(int st,int pos)
{
return st>>pos<<pos-1|st&(1<<pos-1)-1;
}
double dfs(int pos,int st)
{
if(n-K==pos)return 0;
h.len=pos;int sst=st;
if(h[st]>=0)return h[st];
h[st]=0;
int rez[N];
for(int i=1;i<=pos;i++,sst>>=1)
rez[i]=sst&1;
for(int i=1;i<=(pos>>1);i++)
{
int j=pos-i+1;
int s1=erase(st,j),s2=erase(st,i);
double res1=dfs(pos-1,s1)+rez[j],res2=dfs(pos-1,s2)+rez[i];
h.len=pos;h[st]+=2.0/pos*max(res1,res2);
}
if(pos&1)
{
int i=(pos>>1)+1,s1=erase(st,pos-i+1);
double res=dfs(pos-1,s1)+rez[i];
h.len=pos;h[st]+=1.0/pos*res;
}
return h[st];
} int main()
{
scanf("%d%d%s",&n,&K,s+1);
int now=0;
for(int i=1;i<=n;i++)
{
now<<=1;
if(s[i]=='W')now|=1;
}
printf("%.7lf\n",dfs(n,now));
return 0;
}

C.w

神仙dp。如果把反转一条路径看作增加这样的一条路径,那么最终增加的路径数就等于奇点个数/2。

(由于这道题太神了所以我还是咕掉好了)

#include<cstdio>
#include<iostream>
#include<cstring>
#define pa pair<int,int>
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int N=1e5+5,inf=0x3f3f3f3f;
int n;
int to[N<<1],head[N],nxt[N<<1],w[N<<1],tot;
pa dp[N][2];
pa pls(pa x,pa y)
{
return make_pair(x.first+y.first,x.second+y.second);
}
void add(int x,int y,int z)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
w[tot]=z;
}
void dfs(int x,int f,int e)
{
pa a=make_pair(0,0),b=make_pair(inf,inf),c,d;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(y==f)continue;
dfs(y,x,w[i]);
c=min(pls(a,dp[y][0]),pls(b,dp[y][1]));
d=min(pls(a,dp[y][1]),pls(b,dp[y][0]));
a=c;b=d;
}
if(e==1)dp[x][0]=make_pair(inf,inf);
else dp[x][0]=min(a,make_pair(b.first+1,b.second));
if(e==0)dp[x][1]=make_pair(inf,inf);
else dp[x][1]=min(make_pair(a.first+1,a.second+1),make_pair(b.first,b.second+1));
} int main()
{
n=read();
for(int i=1;i<n;i++)
{
int x=read(),y=read(),col=read(),aim=read(),z;
if(aim==2)z=aim;
else z=col^aim;
add(x,y,z);add(y,x,z);
}
dfs(1,1,0);
cout<<(dp[1][0].first>>1)<<' '<<dp[1][0].second<<endl;
return 0;
}

[CSP-S模拟测试53]题解的更多相关文章

  1. [考试反思]0927csp-s模拟测试53:沦陷

    很喜欢Yu-shi说过的一句话 在OI里,菜即是原罪 对啊. 都会.谁信呢? 没有分数,你说话算什么呢? 你就是菜,你就是不对,没有别的道理. 最没有用的,莫过于改题大神,这就是菜的借口. 但是其实这 ...

  2. CSP-S 模拟测试94题解

    T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...

  3. CSP-S模拟测试 88 题解

    T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...

  4. CSP-S 模拟测试92 题解

    话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好 ...

  5. CSP-S 模拟测试57题解

    人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T ...

  6. CSP-S 模拟测试 51 题解

    考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...

  7. CSP-S 模拟测试 45 题解

    由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...

  8. [CSP-S模拟测试97]题解

    A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼 ...

  9. [CSP-S模拟测试96]题解

    以后不能再借没改完题的理由不写题解了…… A.求和 求$\sum \sum i+j-1$ 柿子就不化了吧……这年头pj都不考这么弱智的公式化简了…… 坑点1:模数不定,可能没有2的逆元,那么只要先把乘 ...

随机推荐

  1. <三剑客> 老三:grep命令用法

    grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正 ...

  2. 【CF1210D】Konrad and Company Evaluation(vector,图论)

    题意:有i个人,m对两两之间的关系,第i个人初始的薪水为i,有q次操作,第i次操作会把v[i]号的薪水提升成n+i 如果两个人之间存在关系,薪水高的会向薪水低的炫耀 定义u,v,w为一个三元组,当u向 ...

  3. LOJ 3092 「BJOI2019」排兵布阵 ——DP

    题目:https://loj.ac/problem/3092 同一个人的不同城堡之间没有什么联系,只是和<=m.所以对每个城堡的 s 个值排序,做一个 f[ i ][ j ] 表示第 i 个城堡 ...

  4. LintCode之合并排序数组

    题目描述: 我的代码: public class Solution { /* * @param A: sorted integer array A * @param B: sorted integer ...

  5. POI 讀取EXCEL

    /*** 獲取單元格數值* * @param cell* @return*/private String getCellValue(Cell cell) {String cellValue = &qu ...

  6. Java并发AtomicBoolean类~

    java.util.concurrent.atomic.AtomicBoolean类提供了可以原子读取和写入的底层布尔值的操作,并且还包含高级原子操作. AtomicBoolean支持基础布尔变量上的 ...

  7. 转载:LESS基本用法

    转载出处:https://blog.csdn.net/qq_38209578/article/details/80566860 转载出处:https://blog.csdn.net/weixin_44 ...

  8. C++中的转换构造函数

    1,类型转换函数主要功能就是做类型转换,类型转换是将一个数据从 A 类型转换  到 B 类型,有隐式类型转换和强制类型转换两种: 2,再论类型转换: 1,标准数据类型之间会进行隐式的类型安全转换: 1 ...

  9. Codeforces 1132D(二分答案+堆)

    题面 传送门 分析 二分答案,考虑如何判定 可以用贪心的方法,每次找最快没电的电脑,在没电前1单位时间给它充电 正确性显然 实现上可以维护一个堆,存储每个电脑电用完的时刻,每次从堆顶取出最小的一个给它 ...

  10. HTML中的img标签属性

    <img>标签 标签用于插入图片.它是单独使用的,没有闭合标签. <img src="https://fakeimg.pl/350x200/ff0000,128/000,2 ...