[ Luogu Contest 10364 ] TG
\(\\\)
\(\#A\) 小凯的数字
给出两个整数\(L,R\),从\(L\)到\(R\)按顺序写下来,求生成整数对\(9\)取模后的答案。
例如\(L=8,R=12\),生成的数字是\(89101112\),对\(9\)取模的答案是\(5\)。
- 多组询问,次数\(\le 10^5\),\(L,R\le 10^{12},L\le R\)。
- 首先要知道一个性质:因为\(10^k-1\equiv 0\pmod{9}\),所以\(10^k\equiv 1\pmod{9}\),于是整个数对\(9\)取模,等于每一个数位上的数字乘以\(10\)对应的幂次之和对\(9\)取模,因为\(10\)的任意幂次对\(9\)取模都为\(1\),所以答案就变成了各个数位上的数字和对\(9\)取模的答案。
- 直接等差数列就和,没必要计算\(2\)的逆元,因为相乘的两项里必有一个是偶数,先除掉就好。
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll t,l,r;
int main(){
scanf("%lld",&t);
while(t--){
scanf("%lld %lld",&l,&r);
if((l+r)%2==0) printf("%lld\n",(l+r)/2%9*(r-l+1)%9);
else printf("%lld\n",(r+l)%9*(r-l+1)/2%9);
}
return 0;
}
\(\\\)
\(\#B\) 密室
一张\(N\)个点\(M\)条边的无向图,通过边有时间的消耗,有两个人开始都在\(1\)号点。有\(K\)个点只能让第一个人通过。
现给出两个特殊点\(A,B\),求出这两点中每一个点都至少都被一个人访问的最早时间。
- \(N\le 5\times 10^4\),\(A,B,K\le N\),数据保证图和可行答案均合法。
显然答案只有可能产生于四种情况:
- 第一个人去\(A\),第二个人去\(B\)
- 第一个人去\(B\),第二个人去\(A\)
- 第一个人先去\(A\),再从\(A\)去\(B\)
- 第一个人先去\(B\),再从\(B\)去\(A\)
显然不存在第二个人去两个点的最优解,因为第二个人能到达的所有地方第一个人都可以到。
预处理\(1,A,B\)三个点的最短路,\(1\)号点需要多处理一次不走那\(K\)个点的最短路,然后四个答案取\(min\)就好。
#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 50010
#define M 100010
#define R register
#define gc getchar
using namespace std;
inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
}
bool s[N],vis[N];
int n,m,k,tot,hd[N],dis[4][N];
struct edge{int to,nxt,w;}e[M<<1];
inline void add(int u,int v,int w){
e[++tot].to=v; e[tot].w=w;
e[tot].nxt=hd[u]; hd[u]=tot;
}
priority_queue<pair<int,int> >q;
inline void dij1(){
memset(vis,0,sizeof(vis));
q.push(make_pair(0,1)); dis[0][1]=0;
while(!q.empty()){
int u=q.top().second; q.pop();
if(vis[u]) continue; vis[u]=1;
for(R int i=hd[u],v;i;i=e[i].nxt)
if(dis[0][v=e[i].to]>dis[0][u]+e[i].w){
dis[0][v]=dis[0][u]+e[i].w;
q.push(make_pair(-dis[0][v],v));
}
}
}
inline void dij2(){
memset(vis,0,sizeof(vis));
q.push(make_pair(0,1)); dis[1][1]=0;
while(!q.empty()){
int u=q.top().second; q.pop();
if(vis[u]) continue; vis[u]=1;
for(R int i=hd[u],v;i;i=e[i].nxt)
if(!s[v=e[i].to]&&dis[1][v]>dis[1][u]+e[i].w){
dis[1][v]=dis[1][u]+e[i].w;
q.push(make_pair(-dis[1][v],v));
}
}
}
inline void dij3(int x){
memset(vis,0,sizeof(vis));
q.push(make_pair(0,x)); dis[2][x]=0;
while(!q.empty()){
int u=q.top().second; q.pop();
if(vis[u]) continue; vis[u]=1;
for(R int i=hd[u],v;i;i=e[i].nxt)
if(dis[2][v=e[i].to]>dis[2][u]+e[i].w){
dis[2][v]=dis[2][u]+e[i].w;
q.push(make_pair(-dis[2][v],v));
}
}
}
inline void dij4(int x){
memset(vis,0,sizeof(vis));
q.push(make_pair(0,x)); dis[3][x]=0;
while(!q.empty()){
int u=q.top().second; q.pop();
if(vis[u]) continue; vis[u]=1;
for(R int i=hd[u],v;i;i=e[i].nxt)
if(dis[3][v=e[i].to]>dis[3][u]+e[i].w){
dis[3][v]=dis[3][u]+e[i].w;
q.push(make_pair(-dis[3][v],v));
}
}
}
int main(){
n=rd(); m=rd(); k=rd();
for(R int i=1;i<=k;++i) s[rd()]=1;
for(R int i=1,u,v,w;i<=m;++i){
u=rd(); v=rd(); w=rd();
add(u,v,w); add(v,u,w);
}
int t1=rd(),t2=rd();
memset(dis,0x3f,sizeof(dis));
dij1(); dij2(); dij3(t1); dij4(t2);
int ans1=max(dis[0][t1],dis[1][t2]);
int ans2=max(dis[0][t2],dis[1][t1]);
int ans3=dis[0][t1]+dis[2][t2];
int ans4=dis[0][t2]+dis[3][t1];
printf("%d\n",min(min(ans1,ans2),min(ans3,ans4)));
return 0;
}
\(\\\)
\(\#C\) \(PION\)贪吃蛇
模拟题,题面见链接。
- \(N,M\le 200\),\(c\le 20,k\le 100\),数据保证图中的蛇不会引起混淆
WA了不知道多少遍......
首先模拟的时候蛇会死的情况:撞墙,撞到自己或其他蛇的身体。
然后蛇吃东西变长也很好操作:更改头指针,把地图食物变为蛇头。
恶心在移动一步到空地:蛇头好说,蛇尾巴呢?
直接找尾巴旁边唯一一个身体或头的符号?虽然开始的时候保证蛇之间不会混淆,但是走着走着就有可能蛇身子成一坨,废了。像下面这种情况下一步并不知道往哪里走。
那就记录每一个节点的前驱,每次移动或死亡都维护一下?废了,如果蛇只有一个头呢。
对每一条蛇用单独一个队列维护。倒序存储,即队头是蛇尾。每次移动的时候先将新的头加入,在将蛇尾重置尾空地。
有了上面的维护方法统计答案就很简单,队列大小即为对应蛇的长度,注意排序需要双关键字。
#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 410
#define R register
#define gc getchar
using namespace std;
inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
}
bool v[N],vis[N][N];
int n,m,k,cnt;
char c,mp[N][N],w[N*N][110];
struct point{
int x,y;
point(int _x=0,int _y=0){x=_x;y=_y;}
};
queue<point> q[N*N];
struct ans{int len,x;}a[N*N];
inline bool cmp(ans x,ans y){
return (x.len==y.len)?x.x<y.x:x.len>y.len;
}
inline void dead(int x){
v[x]=1;
while(q[x].size()){
mp[q[x].front().x][q[x].front().y]='&';
q[x].pop();
}
}
inline void move(int x,char t){
int nx=q[x].back().x,ny=q[x].back().y;
if(t=='W') --nx;
if(t=='S') ++nx;
if(t=='A') --ny;
if(t=='D') ++ny;
if(nx<1||nx>n||ny<1||ny>m) dead(x);
else if(mp[nx][ny]=='#'||mp[nx][ny]=='@') dead(x);
else if(mp[nx][ny]=='.'){
mp[nx][ny]='@'; mp[q[x].back().x][q[x].back().y]='#';
mp[q[x].front().x][q[x].front().y]='.';
q[x].push((point){nx,ny}); q[x].pop();
}
else{mp[nx][ny]='@'; mp[q[x].back().x][q[x].back().y]='#';q[x].push((point){nx,ny});}
}
void dfs(int x,int y){
vis[x][y]=1;
if(mp[x+1][y]=='#'&&!vis[x+1][y]) dfs(x+1,y);
if(mp[x-1][y]=='#'&&!vis[x-1][y]) dfs(x-1,y);
if(mp[x][y+1]=='#'&&!vis[x][y+1]) dfs(x,y+1);
if(mp[x][y-1]=='#'&&!vis[x][y-1]) dfs(x,y-1);
q[cnt].push((point){x,y});
}
int main(){
n=rd(); m=rd(); k=rd();
for(R int i=1;i<=n;++i){
c=gc();
while(c!='.'&&c!='#'&&c!='@'&&c!='&') c=gc();
mp[i][1]=c;
scanf("%s",mp[i]+2);
}
for(R int i=1;i<=n;++i)
for(R int j=1;j<=m;++j) if(mp[i][j]=='@') ++cnt,dfs(i,j);
for(R int i=1;i<=cnt;++i){
c=gc();
while(!isupper(c)) c=gc();
w[i][1]=c;
for(R int j=2;j<=k;++j) w[i][j]=gc();
}
for(R int i=1;i<=k;++i)
for(R int j=1;j<=cnt;++j) if(!v[j]) move(j,w[j][i]);
for(R int i=1;i<=cnt;++i) a[i].x=i,a[i].len=q[i].size();
int ss=0;
for(R int i=1;i<=cnt;++i) a[i].x=i;
for(R int i=1;i<=n;++i)
for(R int j=1;j<=m;++j) if(mp[i][j]=='&') ++ss;
sort(a+1,a+1+cnt,cmp);
for(R int i=1;i<=cnt;++i) printf("%d %d\n",a[i].len,a[i].x);
printf("%d",ss);
return 0;
}
[ Luogu Contest 10364 ] TG的更多相关文章
- Luogu 1452 Beauty Contest
Luogu 1452 Beauty Contest 求平面最远点对,先求出凸包,再找凸包的直径. 使用旋转卡壳,直径一定出现在对踵点对间.比较不同点到同一直线距离可以用叉积算三角形面积来比较. 实现时 ...
- Luogu P2419 [USACO08JAN]牛大赛Cow Contest
题目背景 [Usaco2008 Jan] 题目描述 N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a p ...
- luogu题解 P2419 【牛大赛Cow Contest】传递丢包
题目链接: https://www.luogu.org/problemnew/show/P2419 分析: "在交际网络中,给定若干元素和若干对二元关系,且关系具有传递性. 通过传递性推导出 ...
- luogu P1452 [USACO03FALL]Beauty Contest G /【模板】旋转卡壳
LINK:旋转卡壳 如题 是一道模板题. 容易想到n^2暴力 当然也能随机化选点 (还真有人过了 考虑旋转卡壳 其实就是对于某个点来说找到其最远的点. 在找的过程中需要借助一下个点的帮助 利用当前点到 ...
- Luogu 魔法学院杯-第二弹(萌新的第一法blog)
虽然有点久远 还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题 沉迷游戏,伤感情 #include <queue> ...
- 2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest
2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest A Secret of Chocolate Poles 思路:暴力枚举黑巧克力的个数和厚黑巧克力的个 ...
- CF455C Civilization | luogu HXY造公园
题目链接: https://www.luogu.org/problemnew/show/P2195 http://codeforces.com/contest/455/problem/C 显然我们可以 ...
- online contest
http://atcoder.jp/contest https://nanti.jisuanke.com/contest http://codeforces.com/ https://www.nowc ...
- 洛谷—— P2419 [USACO08JAN]牛大赛Cow Contest
https://www.luogu.org/problem/show?pid=2419 题目背景 [Usaco2008 Jan] 题目描述 N (1 ≤ N ≤ 100) cows, convenie ...
随机推荐
- Java基础学习总结(79)——Java本地接口JNI详解
对于java程序员来说,java语言的好处和优点,我想不用我说了,大家自然会说出很多一套套的.但虽然我们作为java程序员,但我们不得不承认java语言也有一些它本身的缺点.比如在性能.和底层打交道方 ...
- [luoguP3047] [USACO12FEB]附近的牛Nearby Cows(DP)
传送门 dp[i][j][0] 表示点 i 在以 i 为根的子树中范围为 j 的解 dp[i][j][1] 表示点 i 在除去 以 i 为根的子树中范围为 j 的解 状态转移就很好写了 ——代码 #i ...
- tyvj1271 零式求和
描述 请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N.现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白(例如1-2 3就等于1- ...
- java虚拟机(二)--垃圾收集器与内存分配策略
1.判断对象是否存活的算法: 1.1.引用计数算法:给对象添加一个引用计数器,每当有一个地方引用他时,计数器+1,当引用失效时,计数器-1,任何时刻计数器为0的对象就是不可能再被引用的,但是他很难解决 ...
- android保存bitmap到sdcard
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { //判断sdcard是否存在和是否具有读写 ...
- MySQL基于域名做高可用切换(Consul初试)
一,Consul功能介绍 服务发现 - Consul的客户端可用提供一个服务,比如 api 或者mysql ,另外一些客户端可用使用Consul去发现一个指定服务的提供者.通过DNS或者HTTP应用程 ...
- 1. 找出数组中的单身狗OddOccurrencesInArray Find value that occurs in odd number of elements.
找出数组中的单身狗: 1. OddOccurrencesInArray Find value that occurs in odd number of elements. A non-empty ze ...
- 从零单排入门机器学习:Octave/matlab的经常使用知识之矩阵和向量
Octave/matlab的经常使用知识之矩阵和向量 之前一段时间在coursera看了Andrew ng的机器学习的课程,感觉还不错.算是入门了.这次打算以该课程的作业为主线,对机器学习基本知识做一 ...
- UVA 10555 - Dead Fraction(数论+无限循环小数)
UVA 10555 - Dead Fraction 题目链接 题意:给定一个循环小数,不确定循环节,求出该小数用分数表示,而且分母最小的情况 思路:推个小公式 一个小数0.aaaaabbb... 表示 ...
- shell 脚本大文件处理
shell 脚本大文件处理 字符串处理 s='{"_id":{"$oid":"59b73d80930c17474f9f050d"},&qu ...