17-06-26模拟赛

T1:对于每个字母存储每次移动后x坐标与y坐标与所有操作开始前的的变化量,将(T/len)乘变化量再加第(T%len)个变化量即可。

Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define ll long long
 5 #define MN 5005
 6 using namespace std;
 7 inline ll in(){
 8     ll x=0;bool f=0; char c;
 9     for (;(c=getchar())<‘0‘||c>‘9‘;f=c==‘-‘);
10     for (x=c-‘0‘;(c=getchar())>=‘0‘&&c<=‘9‘;x=(x<<3)+(x<<1)+c-‘0‘);
11     return f?-x:x;
12 }
13 char ch[MN];
14 ll dx[MN],dy[MN],ax,ay,t;
15 int main()
16 {
17     scanf("%s",ch);t=in();
18     int len=strlen(ch);dx[0]=dy[0]=0;
19     for (int i=0;i<len;++i){
20         if (i) dx[i]=dx[i-1];dy[i]=dy[i-1];
21         switch (ch[i]){
22             case ‘E‘:++dx[i];break;
23             case ‘S‘:--dy[i];break;
24             case ‘W‘:--dx[i];break;
25             case ‘N‘:++dy[i];break;
26         }
27     }int tr=t/len;ax=tr*dx[len-1];ay=tr*dy[len-1];
28     t%=len;ax+=dx[t-1];ay+=dy[t-1];
29     printf("%lld %lld",ax,ay);return 0;
30 }

T2:二分答案,注意需用到高精度计算。

Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define ll long long
 5 #define MN 20000
 6 using namespace std;
 7 struct hpc{
 8     ll num[5005];
 9     int len;
10 }a,b;
11 char m[MN+5],n[MN+5];
12 inline int max(ll a,ll b){return a>b?a:b;}
13 bool operator >(const hpc &a,const hpc &b){
14     if (a.len!=b.len) return a.len>b.len;
15     for (int i=a.len-1;i>=0;--i)
16     if (a.num[i]!=b.num[i]) return a.num[i]>b.num[i];
17     return 0;
18 }
19 hpc operator * (hpc &a,ll b){
20     hpc ans;int &len=ans.len;
21     memset(ans.num,0,sizeof(ans.num));
22     for (int i=0;i<a.len;++i){
23         ans.num[i]+=a.num[i]*b;
24         ans.num[i+1]+=ans.num[i]/10000;
25         ans.num[i]%=10000;
26     }len=a.len;
27     for (;ans.num[len]>0;++len){
28         ans.num[len+1]=ans.num[len]/10000;
29         ans.num[len]%=10000;
30     }return ans;
31 }
32
33 inline ll div(hpc &a,hpc &b){
34     ll l=0ll,r=2000000000ll;
35     while (l+1<r){
36         ll mid=(l+r)>>1;
37         if (b*mid>a) r=mid;else l=mid;
38     }if (b*r>a) return l;else return r;
39 }
40 hpc change(char *ch){
41     int len=0,lc=strlen(ch);hpc ans;
42     memset(ans.num,0,sizeof(ans.num));
43     for (int i=lc-1;i>=0;i-=4){
44         int x=0,k=max(0,i-3);
45         for (int j=k;j<=i;++j)
46         x=(x<<3)+(x<<1)+(ch[j]-‘0‘);
47         ans.num[len++]=x;
48     }ans.len=len;return ans;
49 }
50 int main()
51 {
52     scanf("%s",m);scanf("%s",n);
53     a=change(m);b=change(n);
54     printf("%lld\n",div(a,b));return 0;
55 }

T3:令f[i]表示在第i个点能拿到的最大值.

对于第i个点,考虑贪心选取第[i-r,i-l]个点中的最大fi再加上ai即可。

考虑用堆维护[i-r,i-l]中f的最大值。时间复杂度O(n log n)。

Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<queue>
 5 #define ll long long
 6 #define inf 0x7fffffff
 7 #define MN 200005
 8 using namespace std;
 9 typedef pair<int,int> P;//f[pos],pos
10 priority_queue<P,vector<P> >q;
11 inline int in(){
12     int x=0;bool f=0; char c;
13     for (;(c=getchar())<‘0‘||c>‘9‘;f=c==‘-‘);
14     for (x=c-‘0‘;(c=getchar())>=‘0‘&&c<=‘9‘;x=(x<<3)+(x<<1)+c-‘0‘);
15     return f?-x:x;
16 }
17 int f[MN],a[MN],pre[MN],way[MN],mx=-inf;
18 int n,l,r,lps,cnt=0;
19 int main()
20 {
21     n=in();l=in();r=in();int lps;
22     for (int i=0;i<=n;++i) a[i]=in();
23     for (int i=1;i<=n;++i){
24         if (i<l) f[i]=-inf;
25         else{
26             int cur=q.top().second;
27             while (cur<i-r) q.pop(),cur=q.top().second;
28             pre[i]=cur;f[i]=f[cur]+a[i];
29         }lps=i-l+1;
30         if (lps>=0&&f[lps]!=-inf)q.push(make_pair(f[lps],lps));
31     }lps=n-r+1;
32     for (int i=lps;i<=n;++i) if (f[i]>mx) mx=f[i],way[0]=i;
33     printf("%d\n",mx);
34     for (int i=way[0];i;i=pre[i]) way[++cnt]=i;printf("0 ");
35     for (int i=cnt;i>0;--i) printf("%d ",way[i]);printf("-1");
36     return 0;
37 }

T4:找到点数最多且字典序最先的强联通分量即可。

Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define MN 5005
 5 #define ME 50005
 6 #define inf 100005
 7 using namespace std;
 8 inline int in(){
 9     int x=0;bool f=0; char c;
10     for (;(c=getchar())<‘0‘||c>‘9‘;f=c==‘-‘);
11     for (x=c-‘0‘;(c=getchar())>=‘0‘&&c<=‘9‘;x=(x<<3)+(x<<1)+c-‘0‘);
12     return f?-x:x;
13 }
14 struct edge{
15     int to,next;
16 }e[ME<<1],r[ME<<1];
17 int hd[MN],rh[MN],t[MN],od[MN],ans[MN];
18 bool vis[MN];
19 int n,m,a,b,tp,mn,ct=0,siz,cnt=0,rct=0,amin=inf;
20 inline int min(int a,int b){return a<b?a:b;}
21 inline void ins (int x,int y){
22     ++cnt;e[cnt].to=y;e[cnt].next=hd[x];hd[x]=cnt;
23     ++rct;r[rct].to=x;r[rct].next=rh[y];rh[y]=rct;
24 }
25 void dfs(int x){
26     vis[x]=1;
27     for (int i=hd[x];i;i=e[i].next){
28         int v=e[i].to;
29         if (!vis[v]) dfs(v);
30     }
31     od[++ct]=x;
32 }
33 void rdfs(int x){
34     vis[x]=1;t[++ct]=x;mn=min(mn,x);
35     for (int i=rh[x];i;i=r[i].next){
36         int v=r[i].to;
37         if (!vis[v]) rdfs(v);
38     }
39 }
40 int main()
41 {
42     n=in();m=in();memset(vis,0,sizeof(vis));
43     for (int i=1;i<=m;++i){
44         a=in();b=in();tp=in();
45         if (tp==1) ins(a,b);
46         else ins(a,b),ins(b,a);
47     }
48     for (int i=1;i<=n;++i) if (!vis[i]) dfs(i);
49     memset(vis,0,sizeof(vis));ct=siz=0;
50     for (int i=n;i;--i){
51         if (!vis[od[i]]) ct=0,mn=inf,rdfs(od[i]);
52         if (ct<siz||(ct==siz&&mn>amin)) continue;
53         siz=ct;amin=mn;memcpy(ans,t,sizeof(t));
54     }sort(ans+1,ans+siz+1);printf("%d\n",siz);
55     for (int i=1;i<=siz;++i) printf("%d ",ans[i]);return 0;
56 }
时间: 2024-09-29 02:53:02

17-06-26模拟赛的相关文章

2017.9.17校内noip模拟赛解题报告

预计分数:100+60+60=220 实际分数:100+60+40=200 除了暴力什么都不会的我..... T1 2017.9.17巧克力棒(chocolate) 巧克力棒(chocolate)Time Limit:1000ms Memory Limit:64MB题目描述LYK 找到了一根巧克力棒,但是这根巧克力棒太长了,LYK 无法一口吞进去.具体地,这根巧克力棒长为 n,它想将这根巧克力棒折成 n 段长为 1 的巧克力棒,然后慢慢享用.它打算每次将一根长为 k 的巧克力棒折成两段长为 a

9.26模拟赛

NOIP 2017 全真模拟冲刺 ---LRH&&XXY 题目名称 那些年 铁路计划 毁灭 题目类型 传统 传统 传统 可执行文件名 years trainfare destroy 输入文件名 years.in trainfare.in destroy.in 输出文件名 years.out trainfare.out destroy.out 每个测试点时限 1.5s 1.0s 1.0s 内存限制 256 MB 256 MB 256 MB 测试点数目 20 20 20 每个测试点分值 5 5

2018/02/26 模拟赛

第一题排序暴力 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<string> 5 #include<algorithm> 6 #include<cmath> 7 #include<utility> 8 #include<stdio.h> 9 #include<cstdlib> 10 #include<

NOIP模拟9.17(TYVJNOIP2017模拟赛D2)

曼德布洛特(Mandelbrot)集合 算法课W1·leetcode654.MaximumBinaryTree 官方文档PackageOverview软件包概述--几何内核类 glClearColor第四个参数有什么用? dxd奈犯材http://p.baidu.com/itopic/main/center?uid=00266162633962396665360ebc&59m6丶号斗yrci6b觅滓问http://p.baidu.com/itopic/main/center?uid=4ba761

2019.9.26模拟赛

T1序列 这个题大佬们爆踩std了 给一个序列,其中一段排序后是某一等比数列子序列,求最长长度. 怎么做 数据太水导致枚举公比的过了 序列中每两个数做商,如果整除了的话,这个商一定是公比的次幂.我们从大到小枚举它是公比的几次幂,从而求到最小的公比.由于\(2^{60} > 1^{18}\),这个枚举只需要从59开始即可.时间复杂度\(O(64n)\) Code pow有精损注意判一下.(不要瞎搞手写分数次幂) #include <bits/stdc++.h> namespace fdat

2019.10.26模拟赛

T1 序列 给定一长度为\(n\)的序列\(s\),定义其健美值为:\[\sum\limits_{i=1}^{n}|s_i - i|\]因为 zzq 喜欢健美,所以 zzq 希望减小\(s\)的健美值,以衬托 zzq 的健美.为了达到 zzq 的目的,zzq 希望你对序列进行旋转操作,一次旋转操作可以使序列中的所有元素前移一位,并使\(s_1\)移动到\(s_n\). 可以进行任意次旋转操作,zzq 希望旋转后的健美值最小,请找出这个最小值. SOV 智商检测题 我们发现对于每个数,移动每一次会

【BZOJ】【2741】【FOTILE模拟赛】L

可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成[某个区间中 max(两个数的异或和)] 要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了:然而我们并不能. 一个常见的折中方案:分块! 这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值. 我们不预处理所有的左端点,我

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

【题解】PAT团体程序设计天梯赛 - 模拟赛

由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可. 1 #include <cstdio> 2 3 long long abs(long long x) 4 { 5 return x < 0 ? -x : x; 6 } 7 8 long long gcd(long

[铁一中OI模拟赛]2017.8.19 Day1

T1 小Z的情书 题目链接 思考: 题目主要难度在于旋转后的位置如何,在手写了样例之后不难发现规律. #include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) #define down(a,b,c) for(register int c=a;c>=b;--c) const int Maxn=1005; int n; bool Map[Maxn][Maxn],