10.07 WZZX Day2总结
今天仍然是KCZ出题。今天才知道KCZ不仅是WZ地区史上最强选手而且还是ZJ队长?在ZJOI拿到Rank1的男人?%%%%%
今天KCZ出题的依然很强势……
T1.wzoi
期望得分20~100 实际得分100
可能KCZ也想怀念一下自己地区的OI?
这道题一开始的时候想了个贪心,暂时没发现啥反例,但是其实没什么把握,就先去把后面的题写了。
回来的时候大致想的差不多了,然后发现自己其实也不会写暴力,稳拿的只有20这个算法还能过,那就直接交吧。自己测了几组数据,也没卡掉。
后来评测发现自己A了,题解说的也是一样的。之后想懂了,一是肯定不存在不得分的做题,因为如果有的哈我们只要换一种题就能得10分。然后肯定不压题更好,所以应该有题就做。最后的想法是,是否压几道题会导致可能得分更高?不会。出现上述情况只有一种可能,就是你在压题的时候做了几道10分的题,比你不压题的时候做几道5分的题得分更多,但是这不可能,因为如果你要通过压题来获得更高的分数,你现在压的肯定不是你要做的题,否则的话你直接做就行了,然后每次你只能做最后看的题,所以这就完全没有必要了。所以这样贪心是可以的。
看一下代码。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<set>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n') using namespace std;
typedef long long ll;
const int M = ; int read()
{
int ans = ,op = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') op = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
ans *= ;
ans += ch - '';
ch = getchar();
}
return ans * op;
} int n,tot,stack[M],top,res,a[M];
char s[M]; int main()
{
freopen("wzoi.in","r",stdin);
freopen("wzoi.out","w",stdout);
scanf("%s",s+);
n = strlen(s+),res = n;
rep(i,,n) a[i] = s[i] - '';
rep(i,,n)
{
if(!top)
{
stack[++top] = a[i],res--;
continue;
}
if(stack[top] == a[i]) top--,tot += ;
else if(top == res) top--,tot += ;
else stack[++top] = a[i];
res--;
}
printf("%d\n",tot);
return ;
}
T2.course
期望得分10,实际得分10.
这道题当时真的不会,于是写了一发爆搜交上去,果然得了10分。(剩下全T了)当时只是注意到允许的误差范围很大(0.03),在概率题里面相当大了,不过没想到这竟然是解题的关键。
随机化!题解令人脑洞大开……题解的意思只要随机选取一些序列暴力判断,大致只要枚举10000次就可以了,误差在0.02左右……神奇。
然后自己改了大概30分钟发现相差甚远orz,概率都差了0.2了……于是看了看题解代码,过然简洁。
Ssy神犇直接用自己的随机化A了此题,可怕……
10分爆搜:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<set>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n') using namespace std;
typedef long long ll;
const int M = ; int read()
{
int ans = ,op = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') op = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
ans *= ;
ans += ch - '';
ch = getchar();
}
return ans * op;
} struct node
{
int next,from,to;
}e[M]; int n,pre[],m,rdeg[],cdeg[],ecnt,head[],shate,sum;
char s[],a[],hate[][];
bool vis[]; void add(int x,int y)
{
e[++ecnt].to = y;
e[ecnt].from = x;
e[ecnt].next = head[x];
head[x] = ecnt;
} bool pd()
{
sum++;
rep(i,,m)
{
rep(j,,n)
{
bool flag = ;
rep(k,,hate[i][])
{
if(hate[i][k] != a[j+k-])
{
flag = ;
break;
}
}
if(!flag) return ;
}
}
return ;
} void dfs(int x,int cur)
{
vis[x] = ;
for(int i = head[x];i;i = e[i].next) rdeg[e[i].to]--;
rep(i,,n)
{
if(vis[i] || rdeg[i]) continue;
a[cur] = s[i];
if(cur == n) shate += pd();
else dfs(i,cur+);
a[cur] = ;
}
for(int i = head[x];i;i = e[i].next) rdeg[e[i].to]++;
vis[x] = ;
} int main()
{
freopen("course.in","r",stdin);
freopen("course.out","w",stdout);
n = read();
rep(i,,n) pre[i] = read(),add(pre[i],i),rdeg[i]++;
scanf("%s",s+);
m = read();
rep(i,,m) scanf("%s",hate[i]+),hate[i][] = strlen(hate[i]+);
dfs(,);
double p = double(sum - shate),q = (double)sum;
printf("%.6lf\n",p/q);
return ;
}
std:
#include<bits/stdc++.h>
using namespace std; int rand_int()
{
return RAND_MAX<=?rand():rand()*+rand();
}
#define rep(i,l,r) for(int i=l;i<=r;++i)
const int N=+,TOT=;
int n;
bool in[N];
int fa[N];
char s[N],q[N],t[][]; void rand_q()
{
in[] = ;
rep(head,,n)
{
int now = rand_int() % (n-head+) + ;
int i = ;
while(now -= !in[i]) ++i;
while(!in[fa[i]]) i = fa[i];
in[i] = ,q[head] = s[i];
}
} int main()
{
freopen("course.in","r",stdin);
freopen("course.out","w",stdout);
cin>>n;
rep(i,,n)scanf("%d",fa+i);
scanf("%s",s+);
int m;
cin>>m;
rep(i,,m)scanf("%s",t[i]+);
int ap_cnt=;
rep(tmp,,TOT)
{
rand_q();
bool ap=;
rep(i,,m)
{
int len_t = strlen(t[i]+);
rep(j,,n - len_t+)
{
int k=;
while(k < len_t && q[j+k] == t[i][+k])++k;
if(k == len_t)
{
ap = ;
break;
}
}
if(ap)break;
}
ap_cnt += ap;
}
printf("%f\n", - (double)ap_cnt/TOT);
}
T3.painting
期望得分40,实际得分40.
这道题也是不会做orz。不过考试的时候想到,其实不合法的情况很好判断,只有初始的时候给定的k个点不合法那么才不合法,否则的话任何一种情况都是有解的。我的想法就是,使用一个multiset记录当前的最小元素,然后每次把它向四周暴力外扩,每次+d即可。这样的算法的确是正确的,然后成功骗到了40.
正解实在是没看懂……KCZ大神的T3真心看不懂……把题解copy上来看一眼吧……
过这k个格子的每个格子画一条横着的线和竖着的线,形成一个不超过k*k的大网格,每个小网格的格子要么在大网格的边上(两点之间),要么在格子里(四点之间)。 先跑一遍最短路求出大网格上每个点的美丽值,同时判断是否有解。
边的贡献很好算(实际上也可以转化为格子),下面考虑对大网格每个格子计算贡献。
对于这个格子里的点,它要考虑的限制从原来的k个点变成了4个点。
考虑对这4个点中的每个点计算贡献,先考虑有哪些点是由它的限制取到的最小值(当有多个点的限制同时取到最小值时,强制归为编号最小的那个点),发现只用对一条横着的线,一条竖着的线,一条斜着的线求交。可以 分类讨论,更方便的方法是差分成三个三角形。
时间复杂度O(k^2logk)
std:
#include<bits/stdc++.h>
using namespace std; template <typename T> void chmin(T &x,const T &y)
{
if(x>y)x=y;
}
typedef long long s64;
#define rep(i,l,r) for(int i=l;i<=r;++i)
const int K=+,D=1e9+;
s64 mi(s64 x,int y=D-)
{
s64 ans=;
while(y)
{
if(y&)ans=ans*x%D;
x=x*x%D;y>>=;
}
return ans;
}
const int niv_6=mi();
int n,m,k,d;
s64 g[K][K];
int q[][K];
struct Point
{
int x,y;s64 v;
};
bool operator >(const Point &a,const Point &b)
{
return a.v<b.v;
}
bool operator <(const Point &a,const Point &b)
{
return b>a;
}
Point p[K];
priority_queue<Point>heap; void push(const Point &p)
{
if(g[p.x][p.y]>p.v)
{
g[p.x][p.y]=p.v;
heap.push(p);
}
}
void push(int x,int y,const s64 &v)
{
push((Point){x,y,v});
} int check(s64 x,s64 y,int l,bool t)
{
int i=(y-x+s64(l)*d)/(*d);
return min(l-,max(,i-(t&&(x+s64(i)*d==y+s64(l-i)*d))));
}
s64 S2(s64 a,s64 x)
{
a+=d;
return (x*(x+)/%D*(a%D)+x*(x+)%D*(*x+)%D*niv_6%D*d)%D;
}
s64 check_rec(s64 a,s64 b,s64 c,s64 d,int n,int m)
{
auto S=[&](s64 a,s64 b,s64 c,s64 d,bool tb,bool tc,bool td)->s64
{
int xb=check(a,b,m,tb),xd=check(a,d,n,td),xc=check(a,c,n+m,tc);
chmin(xc,xb+xd);
--xc;
chmin(xb,xc);
chmin(xd,xc);
return (S2(a,xc)-S2(a+s64(xd)*::d,xc-xd)-S2(a+s64(xb)*::d,xc-xb))%D;
};
return (S(a,b,c,d,,,)+S(b,a,d,c,,,)+S(c,d,a,b,,,)+S(d,c,b,a,,,))%D;
}
s64 check_line(s64 x,s64 y,int l)
{
return check_rec(x-d,y-d,y-d,x-d,,l);
} int main()
{
freopen("painting.in","r",stdin);freopen("painting.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&k,&d);
*q[]=;q[][]=;q[][]=n+;
*q[]=;q[][]=;q[][]=m+;
rep(i,,k)
{
int x,y,v;
scanf("%d%d%d",&x,&y,&v);
p[i]=(Point){x,y,v};
q[][++*q[]]=x;
q[][++*q[]]=y;
}
rep(o,,)
{
sort(q[o]+,q[o]+*q[o]+);
*q[o]=unique(q[o]+,q[o]+*q[o]+)-q[o]-;
}
rep(i,,k)
{
Point &p=::p[i];
p.x=lower_bound(q[]+,q[]+*q[]+,p.x)-q[];
p.y=lower_bound(q[]+,q[]+*q[]+,p.y)-q[];
}
rep(i,,*q[])
rep(j,,*q[])g[i][j]=4e18;
rep(i,,k)push(p[i]);
while(!heap.empty())
{
Point p=heap.top();heap.pop();
int x=p.x,y=p.y;s64 v=p.v;
if(g[x][y]!=v)continue;
if(x>)push(x-,y,v+s64(q[][x]-q[][x-])*d);
if(x<*q[])push(x+,y,v+s64(q[][x+]-q[][x])*d);
if(y>)push(x,y-,v+s64(q[][y]-q[][y-])*d);
if(y<*q[])push(x,y+,v+s64(q[][y+]-q[][y])*d);
}
bool impo=;
rep(i,,k)
{
Point p=::p[i];
if(g[p.x][p.y]!=p.v){impo=;break;}
}
if(impo){puts("IMPOSSIBLE");exit();}
s64 ans=;
rep(i,,*q[]-)
rep(j,,*q[]-)(ans+=g[i][j])%=D;
rep(i,,*q[]-)
rep(j,,*q[]-)(ans+=check_line(g[i][j],g[i][j+],q[][j+]-q[][j]))%=D;
rep(i,,*q[]-)
rep(j,,*q[]-)(ans+=check_line(g[i][j],g[i+][j],q[][i+]-q[][i]))%=D;
rep(i,,*q[]-)
rep(j,,*q[]-)
(ans+=check_rec(g[i][j],g[i][j+],g[i+][j+],g[i+][j],q[][i+]-q[][i],q[][j+]-q[][j]))%=D;
printf("%d\n",int((ans+D)%D));
}
今日还有一些诡异的插曲……
自己打T3暴力打完之后突然ZZ,然后把机房后面那条语句打了上去。看到sudo is now world writeable的时候内心很崩溃orz,然后继续作死把权限改成000之后想cd ~,看到permission denied更绝望……
然后只好调回777将就着用,幸好机房电脑能还原不然可就凉凉了。
10.07 WZZX Day2总结的更多相关文章
- 10.06 WZZX Day1总结
今天迎来了WZZX的模拟.打开pdf的时候我特别震惊,出题的竟然是神仙KCZ!没错,就是那个活跃于各大OJ,在各大OJ排名靠前(LOJ Rank1),NOI2018 Rank16进队的kczno1!! ...
- 欧拉回路-Door Man 分类: 图论 POJ 2015-08-06 10:07 4人阅读 评论(0) 收藏
Door Man Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2476 Accepted: 1001 Description ...
- 【NOIP2019模拟2019.10.07】果实摘取 (约瑟夫环、Mobius反演、类欧、Stern-Brocot Tree)
Description: 小 D 的家门口有一片果树林,果树上果实成熟了,小 D 想要摘下它们. 为了便于描述问题,我们假设小 D 的家在二维平面上的 (0, 0) 点,所有坐标范围的绝对值不超过 N ...
- 6383. 【NOIP2019模拟2019.10.07】果实摘取
题目 题目大意 给你一个由整点组成的矩形,坐标绝对值范围小于等于\(n\),你在\((0,0)\),一开始面向\((1,0)\),每次转到后面第\(k\)个你能看到的点,然后将这条线上的点全部标记删除 ...
- C# Socket的TCP通讯 异步 (2015-11-07 10:07:19)转载▼
异步 相对于同步,异步中的连接,接收和发送数据的方法都不一样,都有一个回调函数,就是即使不能连接或者接收不到数据,程序还是会一直执行下去,如果连接上了或者接到数据,程序会回到这个回调函数的地方重新往下 ...
- 【JZOJ2019.10.07】模拟赛C组
\(T1\) 题目描述&大意 贝西牛在每个点左右撞来撞去,不能出去 的情况下能活动(达到)的空间总共有多少? 思路 部分过程为: 反正就是能撞的撞 代码:
- Android作业10/07
1.多个Activity界面实现数据的传递 <?xml version="1.0" encoding="utf-8"?> <androidx. ...
- python2.0 s12 day2
s12 day2 视频每节的内容 05 python s12 day2 python编码 1.第一句python代码 python 执行代码的过程 文件读到内存 分析内容 编译字节码 转换机器码 ...
- [转]3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】
本文转自:http://www.cnblogs.com/jirigala/archive/2010/10/07/1845275.html 2010-10-07 21:39 by 通用C#系统架构, 5 ...
随机推荐
- 22Spring基于配置文件的方式配置AOP
直接看代码: package com.cn.spring.aop.impl; //加减乘除的接口类 public interface ArithmeticCalculator { int add(in ...
- Python之机器学习-朴素贝叶斯(垃圾邮件分类)
目录 朴素贝叶斯(垃圾邮件分类) 邮箱训练集下载地址 模块导入 文本预处理 遍历邮件 训练模型 测试模型 朴素贝叶斯(垃圾邮件分类) 邮箱训练集下载地址 邮箱训练集可以加我微信:nickchen121 ...
- Python之面向对象多态
Python之面向对象多态 多态与多态性: 多态: 多态是指一类事物有多种形态,一个抽象类有多个子类,因而多态的概念依赖于继承. 1.序列类型有多种形态:字符串.列表.元组. 2.动物有多种形态:Pe ...
- LeetCode(48)Rotate Image
题目 You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise ...
- 杭电 5363 求集合的非空子集中key的数量
Description soda has a set S with n integers {1,2,…,n}. A set is called key set if the sum of intege ...
- matplotlib多种绘图方式
目录 散点图 条形图 直方图 总结 散点图 假设通过爬虫你获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间(天)变化的某种规律? a = [1 ...
- fd最大值和限制
fd的数量决定了fd的最大值 在Linux下,系统全部能够打开的fd总数为: /proc/sys/fs/file-max,取决于内存 The file-max file /proc/sys/fs/fi ...
- 变量&字符串
变量 变量定义规范: # 声明变量: name = "Neo Zheng" # name为变量名(标识符),"Neo Zheng"是变量值. 变量定义规则: 1 ...
- idea中javaweb的mysql8.0.15配置问题
mysql8.0.x以后的版本在连接数据库的时候有些不同. 首先: Class.forName("com.mysql.cj.jdbc.Driver"); 其次: DriverMan ...
- Ubuntu 16.04安装WinRAR/7-Zip(基于CrossOver)
基于CrossOver的WinRAR/7-Zip有如下缺点: 1.不能像Windows那样右键菜单解压 可以解决的问题: 1.可以使用提供的浏览工具进行文件选择再解压,只是在操作上多一步. 2.类似百 ...