uoj #190. 【集训队互测2016】消失的源代码 提交答案题
Test 1:
发现是一个字母表的映射
把 \('a' \to 'z'\) 打进去找出映射就好了QAQ .
Test 2:
求助 \(dalao\) 得知的点。。
答案是 : \(2016x^2 + 4x + 10 (\bmod 233333)\)
Test 3:
把给的数列输进 \(OEIS\) 里。
发现是 : \(\lfloor\sqrt{\frac{n}{\pi}}\rfloor\)
Test 4:
发现给的是个图?
随便输几个数据进去发现只与连通性有关。
再进一步分析,发现是连通块大小的平方之和。
... ...
Test 5:
带权的树 ?
下面给的 \(m\) 个点对是啥?
询问?输出怎么只有一个数?
把询问数改成 \(1\)...还是输出一个数。。
好像是路径长度?
询问两次相同的?
输出变成零了!!!!
询问三次?
又变回来了。。。
把所有询问得到的结果 \(xor\) 输出。。。
Test 6:
怎么跟上一个点这么像。。。
询问改成了路径上最小边权?
其他的一点都没变?
。。。 。。。
Test 7:
输入两个数。。输出一个数?
对于所有的 \((i,1) , (1,i)\) 类型的询问的输出都是 \(i\) ?
把这个 \(n\times m\) 的表打出来。。
好像似曾相识。。。
怎么好象是 : \(\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)\) 啊。。。
打了一下发现还真是。。。
反演一波.
Test8:
这个序列好神奇啊 QAQ ...
怎么我连续输出两个相同的序列得到的答案不一样啊。。。
。。。 。。。
只有数据组数不超过一组时,保证lost的输出正确。
。。。 。。。
\(*&@)#(*!(\)^)(!@#(&!@#!(@&#(!@&(#)(!@)#!)@(\((*&!@^#*(!@()!@&*(#^!@(*\)
然后搞了一波发现是本质不同的子串数目。。。
Test9:
随便扔几个点进去发现是平面最近点对。。
写了一个都说是 \(O(n\log n)\) 实际上跑的死慢死慢的东西跑了十几分钟跑出来了。
Test10:
输出 "invalid input!"
#include <map>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;static char ch;static bool flag;flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
#define rg register int
#define rep(i,a,b) for(rg i=(a);i<=(b);++i)
#define per(i,a,b) for(rg i=(a);i>=(b);--i)
namespace work1{
char mp[] = {'y','f','r','b','k','g','i','m','u','j','v','p','h','a','t','d','s','n','e','l','o','z','c','x','w','q'};
char s[100010];
int main(){
int n;read(n);
while(n--){
scanf("%s",s);
int m = strlen(s);
rep(i,0,m-1){
s[i] = mp[s[i] - 'a'];
}
printf("%s\n",s);
}
return 0;
}
}
namespace work2{
inline void work(){
int n;read(n);
printf("%lld\n",(2016LL*n%233333*n%233333+4LL*n+10) % (233333));
}
int main(){
int T;read(T);
while(T--) work();
return 0;
}
}
namespace work3{
const double pi = acos(-1);
inline void work(){
int n;read(n);
printf("%lld\n",(ll)sqrt((double)n/pi));
}
int main(){
int T;read(T);
while(T--) work();
}
}
namespace work4{
const int maxn = 100010;
int fa[maxn],siz[maxn];
int find(int x){return fa[x] == x ? x : fa[x] = find(fa[x]);}
inline void Union(int u,int v){
int x = find(u),y = find(v);
if(x == y) return ;
fa[x] = y;siz[y] += siz[x];
}
int main(){
int T;read(T);
while(T--){
int n,m;read(n);read(m);
rep(i,1,n) fa[i] = i,siz[i] = 1;
int u,v;
while(m--){
read(u);read(v);
Union(u,v);
}
ll ans = 0;
rep(i,1,n){
int x = find(i);
ans += 1LL*siz[x]*siz[x];
siz[x] = 0;
}printf("%lld\n",ans);
}
}
}
namespace work5{
const int maxn = 100010;
struct Edge{
int to,next,dis;
}G[maxn<<1];
int head[maxn],cnt;
void add(int u,int v,int d){
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
G[cnt].dis = d;
}
#define v G[i].to
int fa[maxn],son[maxn],siz[maxn],dep[maxn];
int top[maxn],n;ll dis[maxn];
void dfs(int u){
siz[u] = 1;
for(rg i = head[u];i;i=G[i].next){
if(v == fa[u]) continue;
fa[v] = u;dep[v] = dep[u] + 1;
dis[v] = dis[u] + G[i].dis;
dfs(v);siz[u] += siz[v];
if(siz[son[u]] < siz[v]) son[u] = v;
}return ;
}
void dfs(int u,int tp){
top[u] = tp;
if(son[u]) dfs(son[u],tp);
for(rg i = head[u];i;i=G[i].next){
if(v == fa[u] || v == son[u]) continue;
dfs(v,v);
}return ;
}
#undef v
inline int lca(int u,int v){
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]]) swap(u,v);
u = fa[top[u]];
}return dep[u] < dep[v] ? u : v;
}
inline ll query(int u,int v){
return dis[u] + dis[v] - 2*dis[lca(u,v)];
}
inline void init(){
memset(head,0,sizeof head);
memset(son,0,sizeof son);
memset(top,0,sizeof top);
cnt = 0;
}
inline void work(){
init();
int m;read(n);read(m);
int u,v,d;
rep(i,2,n){
read(u);read(v);read(d);
add(u,v,d);add(v,u,d);
}dfs(1);dfs(1,1);
ll ans = 0;
rep(i,1,m){
read(u);read(v);
ans ^= query(u,v);
}printf("%lld\n",ans);
}
int main(){
int T;read(T);
while(T--) work();
return 0;
}
}
namespace work6{
const int maxn = 100010;
struct Edge{
int to,next,dis;
}G[maxn<<1];
int head[maxn],cnt;
void add(int u,int v,int d){
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
G[cnt].dis = d;
}
#define v G[i].to
int fa[maxn],son[maxn],siz[maxn],dep[maxn];
int top[maxn],dfn[maxn],dfs_clock,w[maxn];
int seq[maxn],n;
void dfs(int u){
siz[u] = 1;
for(rg i = head[u];i;i=G[i].next){
if(v == fa[u]) continue;
fa[v] = u;dep[v] = dep[u] + 1;
w[v] = G[i].dis;
dfs(v);siz[u] += siz[v];
if(siz[son[u]] < siz[v]) son[u] = v;
}return ;
}
void dfs(int u,int tp){
top[u] = tp;dfn[u] = ++ dfs_clock;
seq[dfs_clock] = u;
if(son[u]) dfs(son[u],tp);
for(rg i = head[u];i;i=G[i].next){
if(v == fa[u] || v == son[u]) continue;
dfs(v,v);
}return ;
}
#undef v
int T[maxn<<2];
void build(int rt,int l,int r){
if(l == r){
T[rt] = w[seq[l]];
return ;
}
int mid = l+r >> 1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
T[rt] = min(T[rt<<1],T[rt<<1|1]);
}
int query(int rt,int l,int r,int L,int R){
if(L <= l && r <= R) return T[rt];
int mid = l+r >> 1;
if(R <= mid) return query(rt<<1,l,mid,L,R);
if(L > mid) return query(rt<<1|1,mid+1,r,L,R);
return min(query(rt<<1,l,mid,L,R),query(rt<<1|1,mid+1,r,L,R));
}
inline void init(){
memset(head,0,sizeof head);
memset(w,0,sizeof w);
memset(son,0,sizeof son);
memset(top,0,sizeof top);
memset(dfn,0,sizeof dfn);
memset(seq,0,sizeof seq);
cnt = 0;dfs_clock = 0;
}
inline int query(int u,int v){
int res = 1987654321;
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]]) swap(u,v);
res = min(res,query(1,1,n,dfn[top[u]],dfn[u]));
u = fa[top[u]];
}
if(dep[u] > dep[v]) swap(u,v);
if(u != v) res = min(res,query(1,1,n,dfn[u]+1,dfn[v]));
return res;
}
void work(){
init();
int m;read(n);read(m);
int u,v,d;
rep(i,2,n){
read(u);read(v);read(d);
add(u,v,d);add(v,u,d);
}dfs(1);dfs(1,1);w[1] = 1987654321;
build(1,1,n);
ll ans = 0,x;
rep(i,1,m){
read(u);read(v);
ans ^= (x = query(u,v));
}printf("%lld\n",ans);
return ;
}
int main(){
int T;read(T);
while(T--) work();
return 0;
}
}
namespace work7{
const int maxn = 1000010;
bool vis[maxn];int pri[maxn],cnt;
ll f[maxn];
inline void liner(int n){
f[1] = 1;
rep(i,2,n){
if(!vis[i]) pri[++cnt] = i,f[i] = i - 1;
rep(j,1,cnt){
ll x = 1LL*i*pri[j];
if(x > n) break;
vis[x] = true;
if(i % pri[j] == 0){
f[x] = f[i]*pri[j];
break;
}f[x] = f[i]*f[pri[j]];
}
}
rep(i,1,n) f[i] += f[i-1];
}
inline void work(){
int n,m;read(n);read(m);
if(n > m) swap(n,m);
ll ans = 0;
for(rg i = 1,j;i <= n;i = j+1){
j = min(n/(n/i),m/(m/i));
ans += (f[j] - f[i-1])*(n/i)*(m/i);
}
printf("%lld\n",ans);
}
int main(){
liner(1000000);
int T;read(T);
while(T--) work();
return 0;
}
}
namespace work8{
const int maxn = 1000010;
struct Node{
int nx[21];
int len,fa;
}T[maxn<<1];
int last,nodecnt,num[maxn<<1];
inline void init(){
last = nodecnt = 0;
T[0].fa = -1;T[0].len = 0;
rep(i,1,20) T[0].nx[i] = 0;
}
inline void insert(int c){
int cur = ++ nodecnt,p;
rep(i,1,20) T[cur].nx[i] = 0;
T[cur].len = T[last].len + 1;
for(p = last;p != -1 && !T[p].nx[c];p = T[p].fa) T[p].nx[c] = cur;
if(p == -1) T[cur].fa = 0;
else{
int q = T[p].nx[c];
if(T[q].len == T[p].len + 1) T[cur].fa = q;
else{
int co = ++ nodecnt;
T[co] = T[q];T[co].len = T[p].len + 1;
for(;p != -1 && T[p].nx[c] == q;p=T[p].fa) T[p].nx[c] = co;
T[cur].fa = T[q].fa = co;
}
}last = cur;++ num[last];
}
int c[maxn],a[maxn],cnt;
void work(){
init();int n;read(n);
rep(i,1,n) read(a[i]),c[i] = a[i];
sort(c+1,c+n+1);cnt = unique(c+1,c+n+1) - c - 1;
rep(i,1,n) a[i] = lower_bound(c+1,c+cnt+1,a[i]) - c;
rep(i,1,n) insert(a[i]);
ll ans = 0;
rep(i,1,nodecnt) ans += T[i].len - T[T[i].fa].len;
printf("%lld\n",ans);
return ;
}
int main(){
int T;read(T);
while(T--) work();
return 0;
}
}
namespace work9{
const int maxn = 1000010;
struct Point{
int x,y;
Point(){}
Point(const int &a,const int &b){
x = a;y = b;
}
}p[maxn];
inline double dis(const Point &a,const Point &b){
return sqrt((double)(a.x-b.x)*(a.x-b.x)+(double)(a.y-b.y)*(a.y-b.y));
}
inline bool cmpx(const Point &a,const Point &b){
return a.x == b.x ? a.y < b.y : a.x < b.x;
}
inline bool cmpy(const Point &a,const Point &b){
return a.y < b.y;
}
Point tmp[maxn];int n;
double solve(int l,int r){
if(l == r) return 1e10;
if(l == r-1) return dis(p[l],p[r]);
int mid = l+r >> 1;double d = 1e10;
d = min(solve(l,mid),solve(mid+1,r));
int cnt = 0;
rep(i,1,n) if(abs(p[i].x - p[mid].x) < d) tmp[++cnt] = p[i];
sort(tmp+1,tmp+cnt+1,cmpy);
rep(i,1,cnt){
rep(j,i+1,cnt){
if(abs(tmp[i].y - tmp[j].y) >= d) break;
d = min(d,dis(tmp[i],tmp[j]));
}
}return d;
}
inline void work(){
read(n);
rep(i,1,n){
read(p[i].x);read(p[i].y);
}sort(p+1,p+n+1,cmpx);
printf("%.3lf\n",solve(1,n));
}
int main(){
int T;read(T);
while(T--) work();
}
}
namespace work10{
inline void work(){
puts("invalid input!");
}
int main(){
int T;read(T);
while(T--) work();
}
}
int main(){
int n;read(n);
if(n == 1) work1::main();
if(n == 2) work2::main();
if(n == 3) work3::main();
if(n == 4) work4::main();
if(n == 5) work5::main();
if(n == 6) work6::main();
if(n == 7) work7::main();
if(n == 8) work8::main();
if(n == 9) work9::main();
if(n == 10) work10::main();
return 0;
}
uoj #190. 【集训队互测2016】消失的源代码 提交答案题的更多相关文章
- UOJ#191. 【集训队互测2016】Unknown 点分治 分治 整体二分 凸包 计算几何
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ191.html 题目传送门 - UOJ191 题意 自行移步集训队论文2016中罗哲正的论文. 题解 自行 ...
- UOJ#191. 【集训队互测2016】Unknown
题意:维护一个数列,每个元素是个二维向量,每次可以在后面加一个元素或者删除一个元素.给定P(x,y),询问对于[l,r]区间内的元素$S_i$,$S_i \times P$的最大值是多少. 首先简单地 ...
- 【loj2461】【2018集训队互测Day 1】完美的队列
#2461. 「2018 集训队互测 Day 1」完美的队列 传送门: https://loj.ac/problem/2461 题解: 直接做可能一次操作加入队列同时会弹出很多数字,无法维护:一个操作 ...
- 【2018集训队互测】【XSY3372】取石子
题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...
- 洛谷 P4463 - [集训队互测 2012] calc(多项式)
题面传送门 & 加强版题面传送门 竟然能独立做出 jxd 互测的题(及其加强版),震撼震撼(((故写题解以祭之 首先由于 \(a_1,a_2,\cdots,a_n\) 互不相同,故可以考虑求出 ...
- 【uoj#94】【集训队互测2015】胡策的统计(集合幂级数)
题目传送门:http://uoj.ac/problem/94 这是一道集合幂级数的入门题目.我们先考虑求出每个点集的连通生成子图个数,记为$g_S$,再记$h_S$为点集$S$的生成子图个数,容易发现 ...
- 【集训队互测2015】Robot
题目描述 http://uoj.ac/problem/88 题解 维护两颗线段树,维护最大值和最小值,因为每次只有单点查询,所以可以直接在区间插入线段就可以了. 注意卡常,不要写STL,用链表把同类修 ...
- LOJ3069. 「2019 集训队互测 Day 1」整点计数(min_25筛)
题目链接 https://loj.ac/problem/3069 题解 复数真神奇. 一句话题意:令 \(f(x)\) 表示以原点 \((0, 0)\) 为圆心,半径为 \(x\) 的圆上的整点数量, ...
- BZOJ3938 & UOJ88:[集训队互测2015]Robot——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3938 http://uoj.ac/problem/88 小q有n只机器人,一开始他把机器人放在了一 ...
随机推荐
- shell脚本小示例
求1-100自然数的和: 法一:for循环 #!/bin/bash # declare -i sum=0 for ((i=0;i<=100;i++));do let sum+=$i done e ...
- ping主机脚本
#!/bin/bash #ping net='172.16.1' uphosts=0 downhosts=0 for i in {1..254};do ping -c 1 -w 1 ${net}.${ ...
- Metasploit 内网渗透篇
0x01 reverse the shell File 通常做法是使用msfpayload生成一个backdoor.exe然后上传到目标机器执行.本地监听即可获得meterpreter shell. ...
- 导出成可运行jar包时所遇问题的解决办法 - 转载
Could not find main method from given launch configuration 当我把我的Java工程导出为可运行的jar包时,遇到了“Could not fin ...
- 关于eclipse中看不到源码的问题
这几步之后会生成一个src压缩包,再用att打开即可.记住 要按ctrl再点击
- Google推荐——Glide使用详解(图片加载框架)
零.前言 本文所使用的Glide版本为3.7.0 一.简介 Glide,一个被google所推荐的图片加载库,作者是bumptech.这个库被广泛运用在google的开源项目中,包括2014年的goo ...
- 关于Android中根据ID名动态获取资源的两个方法
在开发中, 我们习惯了类似下面这种方式去实现引用资源: context.getResources().getDrawable(R.drawable.flower); 但是,当我们提前知道这个资源的id ...
- LeetCode第[14]题(Java): Longest Common Prefix
题目:最长公共前缀 难度:EASY 题目内容: Write a function to find the longest common prefix string amongst an array o ...
- SSL和SSH的区别
SSL是一种国际标准的加密及身份认证通信协议,您用的浏览器就支持此协议.SSL(Secure Sockets Layer)最初是由美国Netscape公司研究出来的,后来成为了Internet网上安全 ...
- MFC--串口编程---WIN API的方式将串扣操作封装在线程类中
串口采集数据 本文档介绍的是如何获取串口原始数据并将原始数据解析成可处理或可展示的数据. 一.串口采集有很多方式: 1).MFC有一个专门的控件,直接编程采集,一个控件只能采集一个串口,而且串口名字比 ...