EXAM个人训练赛五

EXAM个人训练赛五

已完成
  • [x] A
  • [x] E
  • [ ] K*
  • [x] M*
    未完成
  • [ ] C
  • [ ] F
    放弃没人做出来的题

A

要用ll,然后注意正方形的情况,细心一点

E

有点动态规划的感觉,状态的转移,不难,要注意不要漏掉状态

K

正解是DFS 然后用贪心数据弱的话能过,先排圆心

M

树状数组,可以维护前面有多少数比这个数小,然后通过相减也可以得出后面有多少数比它小,后面要用到容斥的思想

  • 12xx(xx比1 2大)可以通过组合数算出,即前面比它小的选一个,后面比它大的选两个,然后相乘。
  • 1234 可以再次通过树状数组,每个节点的val是前lsamller[]的和,刚好可以得到有多少123 然后乘后面比它大的数的个数就可以
    最后12xx-1234就是最后结果
    注意取模运算
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = int(2e5) + 7, mod = 16777216;
ll s[maxn],l[maxn],r[maxn],big[maxn],puls[maxn];
struct fen{
    ll tree[maxn];
    int n;
    void init(int len_){
        n=len_;
        memset(tree,0,sizeof(tree));
    }
    inline int lowbit(int t){
        return t&(-t);
    }
    void add(int x,int y){
        for(int i=x;i<=n;i+=lowbit(i)){
            tree[i]+=y;
        }
    }
    int getsum(int x){
        int ans=0;
        for(int i=x;i>0;i-=lowbit(i)){
            ans+=tree[i];
        }
        return ans;
    }
}fens;
int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int main()
{
    int n;
    n=read();
    fens.init(n);
    ll ret=0;
    for(int i=1;i<=n;i++){
        s[i]=read();
        l[i]=fens.getsum(s[i]);
        r[i]=s[i]-1-l[i];
        big[i]=n-i-r[i];
        fens.add(s[i],1);
        ret=(ret+(l[i]*(1ll*big[i]*(big[i]-1)/2%mod)%mod))%mod;
    }
    fens.init(n);
    ll ans=0;
    for(int i=1;i<=n;i++){
            puls[i]=fens.getsum(s[i]);
        ans=(ans+puls[i]*big[i]%mod)%mod;
        fens.add(s[i],l[i]);
    }
    printf("%lld\n",(ret-ans+mod)%mod);
    return 0;
}

C

可以转化为图论做,很难看懂
题解的意思是拆开一个点,分成横坐标和纵坐标,然后连边,用BFS,v的点权由u的点权和uv的边权推出,如果矛盾则不符合题意。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
template<class T>
void read(T &res) {
    res = 0;char c = getchar();T f = 1;
    while(c < '0' || c > '9') {
    if(c == '-') f = -1;
    c = getchar();
    }
    while(c >= '0' && c <= '9') {
    res = res * 10 + c - '0';
    c = getchar();
    }
    res *= f;
}
template<class T>
void out(T x) {
    if(x < 0) {putchar('-');x = -x;}
    if(x >= 10) {
    out(x / 10);
    }
    putchar('0' + x % 10);
}
struct node {
    int to,next,val;
}E[4005];
int head[2005],sumE,num[2005];
bool vis[2005];
int T,N,M,K;
void add(int u,int v,int c) {
    E[++sumE].to = v;
    E[sumE].next = head[u];
    E[sumE].val = c;
    head[u] = sumE;
}
void addtwo(int u,int v,int c) {
    add(u,v,c);add(v,u,c);
}
queue<int> q;
bool BFS(int x) {
    while(!q.empty()) q.pop();
    q.push(x);
    vis[x] = 1;
    num[x] = 0;
    while(!q.empty()) {
    int u = q.front();q.pop();
    for(int i = head[u] ; i ; i = E[i].next) {
        int v = E[i].to;
        if(!vis[v]) {
        num[v] = E[i].val - num[u];
        vis[v] = 1;
        q.push(v);
        }
        else if(num[u] + num[v] != E[i].val) return false;
    }
    }
    return true;
}
void Init() {
    read(N);read(M);read(K);
    memset(head,0,sizeof(head));sumE = 0;
    memset(vis,0,sizeof(vis));
    int x,y,c;
    for(int i = 1 ; i <= K ; ++i) {
    read(x);read(y);read(c);
    addtwo(x,y + N,c);
    }
}
void Solve() {
    read(T);
    while(T--) {
    Init();
    bool ans = 1;
    for(int i = 1 ; i <= N + M ; ++i) {
        if(!ans) break;
        if(!vis[i]) ans &= BFS(i);
    }
    if(ans) puts("Yes");
    else puts("No");
    }
}
int main() {
    Solve();
    return 0;
}

原文地址:https://www.cnblogs.com/smallocean/p/9384347.html

时间: 2024-10-01 12:45:44

EXAM个人训练赛五的相关文章

EXAM个人训练赛四

EXAM个人训练赛四 已完成 [x] A [x] D [x] E [x] F [x] J [x] K [x] I* 未完成 [x] B [x] C [x] G [x] H 签到水题 A J F A:英文字母有2426个 J:注意long long D:Transit Tree Path 我直接套了单源最短路的一个模板,有人用的是DFS,模板第一次用,记得是无向图. 代码又臭又长: #include<bits/stdc++.h> using namespace std; const int ma

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&#39;s problem(manacher+二分/枚举)

HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分相同,第一部分与第二部分对称. 现在给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法,求出以第i个点为中心的回文串长度,记录到数组p中 要满足题目所要求的内容,需要使得两个相邻的回文串,共享中间的一部分,也就是说,左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也是一样. 因为我们已经记录下来以

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&amp;#39;s problem(manacher+二分/枚举)

pid=5371">HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称. 如今给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法.求出以第i个点为中心的回文串长度.记录到数组p中 要满足题目所要求的内容.须要使得两个相邻的回文串,共享中间的一部分,也就是说.左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也

最后一周第二天训练赛之第二题

试题: B - B Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice SPOJ ICODER Description Mathews uses a brand new 16-bit instruction processor. (Yeah i am being sarcastic!). It has one register (say R) and it su

Dream_Chaser队训练赛第一场 I题

Dream_Chaser队训练赛第一场 I题 题目来自2012成都区域赛 I - Count Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4472 Description Prof. Tigris is the head of an archaeological team who is currently in charge of a

2017后期 第 1 场训练赛

题目依次为 NKOJ 上 P3496 P4236 P3774 P2407 1.数三角形 方法很多, 比如推出三边 x y z 的限制关系, 然后加加减减得到计算式子 不过也可以用观察法, 暴力计算出 n 为 1 至 13 对应的结果为: 0 0 0 1 3 7 13 22 34 50 70 95 125 相邻两数差为: 0 0 1 2 4 6 9 12 16 20 25 30 这些相邻两数相邻差又为: 0 1 1 2 2 3 3 4 4 5 5 找到规律了, 如果结果第 i 项为第 i - 1

早晨训练赛第一场 B题 哈希

早晨训练赛第一场 B题 B - Trees in a Row Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 402B Description The Queen of England has n trees growing in a row in her garden. At that, the i-th (1 ≤ i 

zzuli训练赛_05_13-K

题意: 是输入N,2<=N<=100000,求N的质因子个数. 样例输入12 5 30 样例输出2 1 3 提示 12 = 2 * 2 * 3 5 = 5 30 = 2 * 3 * 5 解题思路: 就写个判断质数的函数,循环判断就可以,不过不是质数就加,是不同的质数. 具体代码: #include<iostream> #include<cmath> #include<cstring> using namespace std; bool temp[100000

校队训练赛,同时也是HDU4497(数论:素数分解+组合数学)

一.题目 http://acm.hdu.edu.cn/showproblem.php?pid=4497 二.思路 将满足条件的一组x,z,y都除以G,得到x‘,y',z',满足条件gcd(x',y',x') = 1,同时lcm(x',y',x') = G/L.特判,当G%L != 0 时,无解.然后素数分解G/L,假设G/L = p1^t1 * p2^t2 *````* pn^tn.满足上面条件的x,y,z一定为这样的形式.x' = p1^i1 * p2^i2 *```* pn^in.y' =