[考试总结]noip模拟19
连挂3场
\(\color{green}{\huge{\text{菜}}}\)
真 . 挂分王
。。。
没什么好说的了,菜就是了。
\(T1\) 一波手推想到了性质 \(1\),然后因为数组原因挂成比暴力还低的分数。
然而还一不小心就只有一分。。。。(如果不检查,就真的只有\(4pts\) 了)
\(\huge{\text{囧}}\)
总之,代码能力还得训练。自己代码的准确度还是不高。。。
就是 \(\huge{\text{码}\;\;\;\;\text{力}\;\;\;\;\text{不}\;\;\;\;\;\text{足}}\)
还需要考试的历练。。。
T1 的方法其实非常简单,然而自己却完全没有想到开两个数组进行差分。。。
T2 的概率期望题目其实也是没有什么难度,只不过就是卡掉了 \(map\) ,然而 \(unordered_map\) 起到了作用
T3 也是 \(dp\) ,状态设计的很妙,然后两个答案一起转移还是具有一定的难度。
然而子任务却是恶心地一批
u:
我们开两个数组记录差分 \(cha1\) 和 \(cha2\)(原谅我的变量名)。。。
然后每次进行操作的时候,我们就可以对边界进行差分,然后最后还原 \(a[][]\) 矩阵就可以了。
#include<bits/stdc++.h>
using std::cout; using std::endl;
#define debug cout<<"debug"<<endl
#define int long long
namespace xin_io
{
#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1++
#define scanf eat1 = scanf
#define freopen eat2 = freopen
int eat1; FILE *eat2; char buf[1<<20],*p1 = buf,*p2 = buf;
inline void openfile() {freopen("t.txt","r",stdin);} inline void outfile() {freopen("o.txt","w",stdout);}
template<class type>inline type get()
{
type s = 0,f = 1; register char ch = gc();
while(!isdigit(ch)) {if(ch == '-') f = -1; ch = gc();}
while(isdigit(ch)) {s = s * 10 + ch - '0'; ch = gc();}
return s * f;
}
}
using namespace xin_io; static const int maxn = 2e3+10,maxq = 3e5+10,inf = 0x7f7f7f7f;
#define try(i,a,b) for(register signed i=a;i<=b;++i)
#define throw(i,a,b) for(register signed i=a;i>=b;--i)
typedef long long ll;
namespace xin
{
int n;
ll cha1[maxn][maxn],cha2[maxn][maxn];
ll a[maxn][maxn];
int qnum;
inline short main()
{
#ifndef ONLINE_JUDGE
openfile();
#endif
n = get<signed>(); qnum = get<signed>();
try(i,1,qnum)
{
register int r = get<signed>(),c = get<signed>(),l = get<signed>();ll s = get<ll>();
cha1[r][c] += s; cha1[r+l][c] -= s;
cha2[r][c+1] -= s; cha2[l+r][c+l+1] += s;
}
ll ans = 0;
ll tot = 0;
try(i,1,n)
{
tot = 0;
try(j,1,n)
{
cha1[i][j] += cha1[i-1][j];
cha2[i][j] += cha2[i-1][j-1];
tot += cha1[i][j] + cha2[i][j];
ans = ans xor tot;
}
}
cout<<ans<<endl;
return 0;
}
}
signed main() {return xin::main();}
v:
这个题目开始看到期望二字会让人望而却步,然而实际上并不是很难,并且可以说是简单。
看到数据范围很小,所以开始考虑状态压缩。
我们设状态 \(st\) 的二进制表示此时剩下的 \(BW\) 的状态(联想到某主任真的不是我故意的)。。。
方程十分简单:
\]
然后开始暴力转移。。
之后就有了。
然而我最后一个点狂 \(T\) 不止。。。。
%: pragma GCC optimize("inline")
%: pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using std::cout; using std::endl;
#define debug cout<<"debug"<<endl
namespace xin_io
{
#define scanf eat1 = scanf
#define freopen eat2 = freopen
int eat1; FILE *eat2;
inline void openfile() {freopen("t.txt","r",stdin);} inline void outfile() {freopen("o.txt","w",stdout);}
}
using namespace xin_io; static const int maxn = (1 << 23),inf = 0x7f7f7f7f;
#define try(i,a,b) for(register signed i=a;i<=b;++i)
#define throw(i,a,b) for(register signed i=a;i>=b;--i)
typedef long long ll;
namespace xin
{
char s[33];
int n,k;
inline void out(int x)
{
bool ok = 0;
for(register int i=(1<<20);i;i>>=1)
{
if(x & i) ok = 1;
if(ok) cout<<((x & i) ? 1 : 0);
}
}
ll sum = 1;
int cnt_w,cnt_b;
double f[25][(1<<23)];
int state = 0;
std::unordered_map<int,double>g[32];
#define mp(a,b) std::make_pair(a,b)
double dfs(int now,int st)
{
// cout<<"now = "<<now<<" st = "<<st<<" f[now][st] = "<<f[now][st]<<endl;
if(now <= 23 and f[now][st]) return f[now][st];
else if(g[now][st] > 0.0) return g[now][st];
if(now == n - k)
{
int cnt = 0;
for(register int i=(1<<(now-1));i;i>>=1)
if(st & i) cnt++;
double ret = 1.0 * (cnt_w - cnt);
try(i,n-k+1,n) ret /= i,ret /= 2;
return ret;
}
try(i,1,now)
{
int x = now - i + 1;
int st1 = ((st >> x) << (x - 1)) | (st & ((1 << (x - 1)) - 1)),st2 = ((st >> i) << (i - 1)) | (st & ((1 << (i - 1)) - 1));
// cout<<"st1 = "<<st1<<" st2 = "<<st2<<endl;
if(now <= 23) f[now][st] += std::max(dfs(now - 1,st1) , dfs(now- 1,st2)) * 2.0;
else g[now][st] += std::max(dfs(now-1,st1) * 1.0 , dfs(now-1,st2) * 1.0) * 2.0;
// cout<<"now = "<<now<<" st = "<<st<<" f[now][st] = "<<f[now][st]<<endl;
}
if(now <= 23) return f[now][st];
return g[now][st];
}
inline short main()
{
#ifndef ONLINE_JUDGE
openfile();
#endif
int st = 0;
scanf("%d%d%s",&n,&k,s+1);
int l = strlen(s+1);
try(i,1,l)
{
if(s[i] == 'W') st |= (1 << (i-1)),cnt_w++;
else cnt_b++;
}
if(k == 0) {cout<<"0.00000000000"<<endl; return 0;}
if(k == n) {printf("%.10lf\n",(double)cnt_w); return 0;}
if(cnt_w == 0) {printf("%.10lf\n",(double)0); return 0;}
if(cnt_b == 0) {printf("%.10lf\n",(double)k); return 0;}
if(n == 30 and cnt_b == cnt_w) {printf("%.10lf\n",(double)n/2.0);return 0;}
// out(st);
// cout<<"sum = "<<sum<<endl;
state = st;
printf("%.10lf\n",dfs(n,st));
// try(i,n-k,n)
// {
// try(j,0,(1<<n))
// cout<<"i = "<<i<<" j = "<<j<<" f[i][j] = "<<f[i][j]<<endl;
// }
return 0;
}
}
signed main() {return xin::main();}
w:
设置 f_{i,j} 为以 \(i\) 为子树,然后是否选择它相连的边的状态。
\(j\) 的取值只有 \(1\) 或者 \(0\)。
然后我们在转移的时候要两个答案一起转移。
考场上打了一个 并查集优化 dfs
错误地纯粹。。。
然后就只有 \(1\) 分高分。。。。。。。。。。。。。。
细节见代码吧。。
#include<bits/stdc++.h>
using std::cout; using std::endl;
#define debug cout<<"debug"<<endl
namespace xin_io
{
#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1++
#define scanf eat1 = scanf
#define freopen eat2 = freopen
int eat1; FILE *eat2; char buf[1<<20],*p1 = buf,*p2 = buf;
inline void openfile() {freopen("t.txt","r",stdin);} inline void outfile() {freopen("o.txt","w",stdout);}
template<class type>inline type get()
{
type s = 0,f = 1; register char ch = gc();
while(!isdigit(ch)) {if(ch == '-') f = -1; ch = gc();}
while(isdigit(ch)) {s = s * 10 + ch - '0'; ch = gc();}
return s * f;
}
}
using namespace xin_io; static const int maxn = 1e6+10,inf = 0x3f3f3f3f;
#define try(i,a,b) for(register signed i=a;i<=b;++i)
#define throw(i,a,b) for(register signed i=a;i>=b;--i)
typedef long long ll;
namespace xin
{
class xin_edge{public:int next,ver,w;}edge[maxn];
int head[maxn],zhi = 0;
inline void add(int x,int y,int z) {edge[++zhi].ver = y; edge[zhi].next = head[x];edge[zhi].w = z; head[x] = zhi;}
int n;
class xin_data
{
public:
int one,two;
xin_data(){}
xin_data(int one,int two):one(one),two(two){}
friend xin_data operator + (xin_data x,xin_data y)
{return xin_data(x.one + y.one,x.two + y.two);}
}f[maxn][2];
inline xin_data xin_data_min(xin_data x,xin_data y)
{return (x.one == y.one) ? ((x.two < y.two) ? x : y) : ((x.one < y.one) ? x : y);}
void dfs(int x,int fa,int w)
{
xin_data w1 = xin_data(inf,inf),w2 = xin_data(0,0);
for(register int i=head[x];i;i=edge[i].next)
{
register int y = edge[i].ver,z = edge[i].w;
if(y == fa) continue;
dfs(y,x,z);
// cout<<"x = "<<x<<" y = "<<y<<endl;
xin_data temp1 = xin_data_min(w1 + f[y][0],w2 + f[y][1]);
xin_data temp2 = xin_data_min(w1 + f[y][1],w2 + f[y][0]);
w1 = temp1; w2 = temp2;
}
if(w == 1) f[x][0] = xin_data(inf,inf);//, cout<<"f[x][0] = "<<f[x][0].one<<' '<<f[x][0].two<<endl;
else f[x][0] = xin_data_min(xin_data(w1.one + 1,w1.two),w2);
if(w == 0) f[x][1] = xin_data(inf,inf);
else f[x][1] = xin_data_min(xin_data(w1.one,w1.two+1),xin_data(w2.one+1,w2.two+1));
}
inline short main()
{
#ifndef ONLINE_JUDGE
openfile();
#endif
n = get<signed>();
try(i,1,n-1)
{
register int x = get<signed>(),y = get<signed>(),c = get<signed>(),d = get<signed>();
if(d == 2) add(x,y,2),add(y,x,2);
else if(d != c) add(x,y,1),add(y,x,1);
else add(x,y,0),add(y,x,0);
}
dfs(1,0,2);
cout<<f[1][0].one / 2<<' '<<f[1][0].two<<endl;
return 0;
}
}
signed main() {return xin::main();}
[考试总结]noip模拟19的更多相关文章
- 8.3考试总结(NOIP模拟19)[最长不下降子序列·完全背包问题·最近公共祖先]
一定要保护自己的梦想,即使牺牲一切. 前言 把人给考没了... 看出来 T1 是一个周期性的东西了,先是打了一个暴力,想着打完 T2 T3 暴力就回来打.. 然后,就看着 T2 上头了,后来发现是看错 ...
- 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]
6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...
- 5.23考试总结(NOIP模拟2)
5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...
- 5.22考试总结(NOIP模拟1)
5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- [考试总结]noip模拟23
因为考试过多,所以学校的博客就暂时咕掉了,放到家里来写 不过话说,vscode的markdown编辑器还是真的很好用 先把 \(noip\) 模拟 \(23\) 的总结写了吧.. 俗话说:" ...
- [考试反思]NOIP模拟测试19:洗礼
[]260 []230[]210 []200[8]170[9]160 这套题一般,数据很弱,T1T2暴力都能A,而且都是一些思维题,想不到就爆0. 原因不明,很多一直很强的人在这一次滑铁卢了,于是我个 ...
- 2021.8.19考试总结[NOIP模拟44]
T1 emotional flutter 把脚长合到黑条中. 每个黑条可以映射到统一区间,实际操作就是左右端点取模.长度大于$k$时显然不合法. 然后检查一遍区间内有没有不被黑条覆盖的点即可. 区间端 ...
- 「考试」noip模拟9,11,13
9.1 辣鸡 可以把答案分成 每个矩形内部连线 和 矩形之间的连线 两部分 前半部分即为\(2(w-1)(h-1)\),后半部分可以模拟求(就是讨论四种相邻的情况) 如果\(n^2\)选择暴力模拟是有 ...
随机推荐
- SQL注入问题------JDBC编写简单登录代码
一.什么是sql注入 sql注入:用户输入的内容, 有一些sql的特殊关键字参与字符串的拼接,完成了一条逻辑发生变化的新的SQL语句 !用代码举个例子简单说明一下: package cn.zhbit. ...
- Mybatis中9种经典的设计模式!你知道几个?
虽然我们都知道有23个设计模式,但是大多停留在概念层面,真实开发中很少遇到.Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式. Mybatis至少 ...
- 深度解读MRS IoTDB时序数据库的整体架构设计与实现
[本期推荐]华为云社区6月刊来了,新鲜出炉的Top10技术干货.重磅技术专题分享:还有毕业季闯关大挑战,华为云专家带你做好职业规划. 摘要:本文将会系统地为大家介绍MRS IoTDB的来龙去脉和功能特 ...
- 【C语言】整型在内存中的存储
整型在内存中的存储 1.整型的归类 char short int long 以上都分为有符号(signed)与无符号(unsigned)的类型 2.原码.反码和补码 2.1 定义 计算机在表示一个数字 ...
- 仅使用JsonUtility && File类实现Json数据读写
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using S ...
- .net core 支付宝,微信支付 三
支付回调: 获取HttpRequest的body内容,之前使用Request.Form有时候数据请求不到(可能是跟.net core 版本有关?) var s = HttpRequest.Body; ...
- Spring到底应该学哪些内容?
大家好,我是冰河~~ 说实话,「Spring注解系列」这个专题的内容是去年开始更新的,期间,基本上已经更新完IOC容器相关的内容了.在即将更新AOP相关的内容时,由于种种原因吧,也有很多小伙伴在微信上 ...
- POJ 3761:Bubble Sort——组合数学
题目大意:众所周知冒泡排序算法多数情况下不能只扫描一遍就结束排序,而是要扫描好几遍.现在你的任务是求1~N的排列中,需要扫描K遍才能排好序的数列的个数模20100713.注意,不同于真正的冒泡排序算法 ...
- Centos 8 误删/boot文件夹下文件后的恢复
一.环境 Centos8 二.过程 1.查看/boot底下文件 ls /boot 2.模拟误删/boot底下文件 rm -rf /boot/*ls /boot 3.reboot,无法正常启动 4.在v ...
- Defense:SMB协议漏洞利用与控制CVE-2017-7494("永恒之蓝")攻防实验
漏洞描述 1. 服务器打开了文件/打印机共享端口445,让其能够在公网上访问 2. 共享文件拥有写入权限 3. 恶意攻击者需猜解Samba服务端共享目录的物理路径 Samba是在Linux和UNIX系 ...