首页 > 其他分享 >AtCoder Beginner Contest 298(D,F)

AtCoder Beginner Contest 298(D,F)

时间:2023-05-27 17:11:13浏览次数:49  
标签:AtCoder Beginner int cin long define 298 include mod

AtCoder Beginner Contest 298(D,F)

D(思维,模拟,快速幂)

D

大意是最初有一个数字\(1\),然后进行\(q\)个操作

有三种操作

\(1\),输入\(1,x\),在原来的数字后面添加一个尾数,例如原本的数是\(12\),输入了\(1 5\),数字变成了\(125\)

\(2\),输入\(2\),把原来的数字第一位数删除,例如原本的数是\(125\),输入了\(2\),数字变成了\(12\)

\(3\),输入\(3\),我们需要输出此时的数字(对一个数取模)

一开始我想的比较复杂

其实对于添加,我们只需乘\(10\)加\(x\)

对于删除,我们只需要让此时的数字减去此时的数的首位乘上\(10^{len}\),所以,我们需要记录首位数(可以用队列),还有长度

但是,这里要注意一下,就是相减

正确的处理如下

//a-=b,%mod
a=((a-b)%mod+mod)%mod;
//而不是 a=(a-b+mod)%mod,有可能这个b非常大,加了mod后还是负数,不能把最后的答案变成正数
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include<cmath>
#include <unordered_map>
#include <array>
#include <cstring>
using namespace std;
#define int long long 
#define LL long long
#define ios  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define inf 1e18
#define INF 1e18
#define mem(a,b) memset((a),(b),sizeof(a))
const int maxn=6e5+10;
const int mod=998244353;
int n,q;
int ans=1;
int len=0;
int l=1;
queue<int>qq;
int ksm(int x,int p)
{
    int res=1;
    while (p)
    {
        if(p&1)
        {
            res=res*x%mod;
        }
        x=x*x%mod;
        p>>=1;
    }
    return res;
}
int inv(int x)
{
    return ksm(x,mod-2);
}
signed main ()
{
    cin>>q;
    qq.push(1);
    while (q--)
    {
        int op;
        cin>>op;
        if(op==1)
        {
            int x;
            cin>>x;
            qq.push(x);
            ans=(ans*10ll+x)%mod;
            len++;
        }
        else if(op==2)
        {
            int top=qq.front();
            qq.pop();
            int p=(top*ksm(10,len)%mod)%mod;
            ans=((ans-p)%mod+mod)%mod;
              len --;
        }
        else if(op==3)
        {
             cout<<ans<<"\n";
        }
    }
    system ("pause");
    return 0;
}

这次我的\(e\)过了,很简单的一个概率\(dp\),这里就不写了

F(set,思维)

F

题目大意是有一个很大的网格,只有其中的\(n\)个位置有数在这些位置上,其他的都是\(0\)

我们选择一对\(x,y\),\(x\)行和\(y\)列的这个十字架上面的所有位置的和,求这个和的最大值

我们先预先处理好行的和\(sumx\)和列的和\(sumy\)

有两种情况

\(x,y\)上面有数据,那么此时的和就是\(sumx[x]+sumy[y]-a[x] [y]\)(两个都加了一次,这个位置加了两次)

\(x,y\)上面没有数据,直接相加

对于\(x,y\)上面没有数据,我们可以枚举每一个出现过数据的行,然后再在后面的那些没有和这一个行有关系的列中选择,由于不用减,故直接选择较大的那一个,(对于可以很容易删除,可以很容易得到最大值的那一个,我们可以想到\(set\)),后来还有记得把原来删除的列的数据加回来,比较每一个行所相关联的列都是不一样的)

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include<cmath>
#include <unordered_map>
#include <array>
#include <cstring>
using namespace std;
#define int long long 
#define LL long long
#define ios  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define inf 1e18
#define INF 1e18
#define mem(a,b) memset((a),(b),sizeof(a))
const int maxn=6e5+10;
const int mod=998244353;
int n;
struct node
{
    int x,y,val;
}a[maxn];
map<int,int>sumx,sumy;
set<pair<int,int>>py,px;
map<int,vector<int>>pei;
signed main ()
{
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i].x>>a[i].y>>a[i].val;
        sumx[a[i].x]+=a[i].val;
        sumy[a[i].y]+=a[i].val;
        pei[a[i].x].push_back(a[i].y);
    }
    int ans=0;
    for (int i=1;i<=n;i++)
    {
        int now=sumx[a[i].x]+sumy[a[i].y]-a[i].val;
        ans=max(ans,now);
    }
    for (auto [y,sum]:sumy)
    {
        py.insert({sum,y});
    }
    for (auto [x,sum]:sumx)
    {
        px.insert({sum,x});
    }
    for (auto [sum,x]:px)
    {
        for (auto y:pei[x])//和x行相关联的y
        {
            py.erase({sumy[y],y});
        }
        if(py.size())
        {
            int now=sum+(*(--py.end())).first;
            ans=max(ans,now);
        }
        for (auto y:pei[x])
        {
            py.insert({sumy[y],y});
        }
    }
    cout<<ans<<"\n";
    system ("pause");
    return 0;
}

标签:AtCoder,Beginner,int,cin,long,define,298,include,mod
From: https://www.cnblogs.com/righting/p/17437009.html

相关文章

  • AtCoder Beginner Contest 299(E,F)
    AtCoderBeginnerContest299(E,F)E(最短路)E题目大意为有\(n\)个点和\(m\)条边,我们我个这些点匹配颜色(有两种颜色),但是要满足下面的条件必须由一个点的颜色是\(1\)然后给出\(k\)点限制对于\(p_i\)这一个点,离他最近的一个颜色为\(1\)的点的最近距离为\(d_i\)既然知道某个点......
  • Atcoder Grand Contest 062 D - Walk Around Neighborhood
    csy/bxwjz/bx首先将\(a\)排序,如果\(\sum\limits_{i=1}^{n-1}a_i<a_n\)显然就是\(-1\),否则必然有解。先发现一个trivial的事情,就是答案一定位于\([\dfrac{a_n}{2},a_n]\)中,这是因为我们判掉无解的条件之后,我们必然可以用前面的步数走到以\((a_n,0),(0,a_n),(-a_n,0),(......
  • AtCoder Regular Contest 139 E Wazir
    洛谷传送门AtCoder传送门好题。这种题一般可以考虑,观察最优解的性质,对于性质计数。发现如果\(n,m\)均为偶数,可以放满。就是类似这样:#.#.#..#.#.##.#.#..#.#.#因此答案就是\(2\)。如果\(n,m\)有一个为偶数,不妨假设\(n\)为偶数。那么最优解形似:#.#...#..##..#......
  • 【atcoder begin 302】【e题 Isolation 】JAVA的快速输入输出
    importjava.io.*;importjava.util.HashSet;importjava.util.Set;/***@authorfishcanfly*/publicclassMain{publicstaticvoidmain(String[]args)throwsIOException{//BufferedReaderbr=newBufferedReader(newInputStreamReader(......
  • AtCoder Beginner Contest 300(E,F)
    AtCoderBeginnerContest300(E,F)E(概率dp)E这个题意大致就是一开始有一个初始数\(x\)为\(1\),然后我们有一个骰子,最后得到的点数概率一样,为\(\frac{1}{6}\),如果这一次得到的点数为\(i\),那么\(x\)会变成\(i\timesx\),问最后得到数\(n\)的概率为多少先感性的分析一波,对于......
  • AtCoder Regular Contest 146 D >=<
    洛谷传送门AtCoder传送门考虑直接增量构造。把条件拆成形如\(a_u\gex\)时\(a_v\gets\max(a_v,y)\),连边,跑类似一个spfa的东西,就行了。这样一定能构造出一组和最小的解。code//Problem:D->=<//Contest:AtCoder-AtCoderRegularContest146//URL:http......
  • AtCoder Beginner Contest 193 F Zebraness
    洛谷传送门AtCoder传送门复习一下最小割。考虑翻转横纵坐标和为奇数的颜色,那么就变成了,相邻两个格子,相同颜色产生\(1\)的贡献。一眼P4313文理分科。每个格子被分到\(S\)表示染黑,分到\(T\)表示染白。对于每两个相邻格子,建两个虚点,分别表示它们都染黑或者都染白的情况......
  • AtCoder Beginner Contest 302 H. Ball Collector 题解
    AtCoderBeginnerContest302H.BallCollector题意跳过。可以视作将\(a_i,b_i\)之间连了一条边,然后\(a_i,b_i\)之间只能选一个等价于对于一条边只能选择其一个端点。那么对于只包含树的联通块而言,如果都选择儿子节点,那么会有一个根节点无法被选择上;而对于包含至少一个......
  • AtCoder Beginner Contest 302(E,F,G)
    AtCoderBeginnerContest302(E,F,G)E(图,set)E这个题意大致为一开始给出\(n\)个点,没有一条边,后面陆续会有\(q\)次操作,以下两种方式\(1\),输入两个点,代表连接这两个点\(2\),输入一个点,意在把所有和这个点相连的边都删除每一次操作后我的都需要知道操作后还有多少个孤立无援的点(没......
  • AtCoder Regular Contest 132 E Paw
    洛谷传送门AtCoder传送门感觉挺educational的。观察最终形态,发现根据洞分段,有且只有一段没被覆盖,并且左端是向左的脚印,右端是向右的脚印。最终状态就这几种了,直接枚举,概率乘贡献即可。发现左端和右端不影响到对方是对称的,直接求出一边的概率。设\(f_i\)为\(i\)个洞,填......