17.10.24 数据最水的一次考试 A + 35 + 0   题目描述 输入格式 输出格式 样例输入 样例输出 数据范围

 

总结:

总的来说这次考试的测试数据有点垃lj,

T1 n <= 1e5, 然而n ^ 2都是可以过的

T2 感觉 k 就是个lj,没有啥用,首先对于k=1的情况,可以枚举每条q边

即使直接跑最短路也可以过 60%,对于最后30%,实际数据k >= n,然而没仔细看(理解)数据范围。

数组开小了,丢了40‘;

T3 难。

1.每道题都要看数据范围,看看有没有好骗分的lj数据

2.不要开不够数组!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

题目描述

现在有一个字符串,每个字母出现的次数均为偶数。接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现的和六次出现的字母a连一条线...对其他25个字母也做同样的操作。

现在我们想知道有多少对连线交叉。交叉的定义为一个连线的端点在另外一个连线的内部,另外一个端点在外部。

下图是一个例子,共有三对连线交叉(我们连线的时候,只能从字符串上方经过)。

 17.10.24   数据最水的一次考试
A + 35 + 0
 
题目描述
输入格式
输出格式
样例输入
样例输出
数据范围

输入格式

一行一个字符串。保证字符串均由小写字母组成,且每个字母出现次数为偶数次。

输出格式

一个整数,表示答案。

样例输入

abaazooabz

样例输出

3

数据范围

对于30% 的数据,字符串长度不超过50。

对于100% 的数据,字符串长度不超过100,000。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>

using namespace std;
const int N = 1e5 + 10;

string s;
int a[N], l[N], r[N], bel[N], last[N];
int len;
 long long answer;

int main()
{
    freopen("cross.in","r",stdin);
    freopen("cross.out","w",stdout);
    cin >> s;
    int len = s.length();
    for(int i = 0; i < len; i ++)
        a[i + 1] = s[i] - 'a' + 1;
    for(int i = 1; i <= len; i ++)//yi i wei duan dian// 0 -> zuo,  1 ->  you
        if(last[a[i]])
            l[i] = last[a[i]], r[last[a[i]]] = i, last[a[i]] = 0, bel[i] = 1;
        else
            last[a[i]] = i, bel[i] = 0;
    for(int i = 1; i <= 26; i ++)
        for(int j = 1; j <= len; j ++)
            if(a[j] == i && bel[j] == 0){
                int k = j + 1;
                while(a[k] != a[j]){
                    if(bel[k] == 1 && l[k] < j) answer ++;
                    k ++;
                }
                j = k;
            }
    printf("%lld", answer);
    return 0;
} 
/*
abaazooabz
3
*/

跳跳虎回家

17.10.24   数据最水的一次考试
A + 35 + 0
 
题目描述
输入格式
输出格式
样例输入
样例输出
数据范围

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <cstdlib>

using namespace std;
const int N = 5010;
const int oo = 99999999;
const int la = 2005;

int n, m, q, k, now = 1;
int u2[la], v2[la], w2[la];
int head[N], dis[N], dis_2[N], pre[N], is_q[N][N], cha[N];
bool vis[N];
struct Node{
    int u, v, w, nxt;
};
Node E[N << 2];
queue <int> Q;

struct T2{
    inline int read(){
        int x = 0;
        char c = getchar();
        while(c < '0' || c > '9') c = getchar();
        while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
        return x;
    }
    inline void add(int u, int v, int w){
        E[now].v = v;
        E[now].w = w;
        E[now].nxt = head[u];
        head[u] = now ++;
        return ;
    }
    inline int spfa_1(int start, int endd){
        for(int i = 1; i <= n; i ++)
            dis[i] = oo, vis[i] = 0;
        dis[start] = 0;
        vis[start] = 1;
        Q.push(start);
        while(!Q.empty()){
            int topp = Q.front();
            Q.pop();
            vis[topp] = 0;
            for(int i = head[topp]; ~ i; i = E[i].nxt){
                if(dis[E[i].v] > dis[topp] + E[i].w){
                    dis[E[i].v] = dis[topp] + E[i].w;
                    if(!vis[E[i].v]){
                        Q.push(E[i].v);
                        vis[E[i].v] = 1;
                    }
                }
            }
        }
        return dis[endd];
    }
    inline int spfa_2(int start, int endd){
        for(int i = 1; i <= n; i ++)
            dis[i] = oo, vis[i] = 0;
        dis[start] = 0;
        vis[start] = 1;
        Q.push(start);
        while(!Q.empty()){
            int topp = Q.front();
            Q.pop();
            vis[topp] = 0;
            for(int i = head[topp]; ~ i; i = E[i].nxt){
                if(dis[E[i].v] > dis[topp] + E[i].w && !is_q[topp][E[i].v]){
                    dis[E[i].v] = dis[topp] + E[i].w;
                    if(!vis[E[i].v]){
                        Q.push(E[i].v);
                        vis[E[i].v] = 1;
                    }
                }
            }
        }
        return dis[endd];
    }
} t2;


int main(int argc, char *argv[]){
    //freopen("move.in","r",stdin);
    //freopen("move.out","w",stdout);
    n = t2.read();
    m = t2.read();
    q = t2.read();
    k = t2.read();
    for(int i = 1; i <= n; i ++)
        head[i] = -1;
    for(int i = 1; i <= m; i ++){
        int u = t2.read();
        int v = t2.read();
        int w = t2.read();
        t2.add(u, v, w);
    }
    if(k == 0){
        int ans_1 = t2.spfa_1(1, n);
        printf("%d", ans_1 == oo ? -1 : ans_1);
        return 0;
    }
    for(int i = 1; i <= q; i ++){
        u2[i] = t2.read();
        v2[i] = t2.read();
        w2[i] = t2.read();
        is_q[u2[i]][v2[i]] = 1;
        t2.add(u2[i], v2[i], w2[i]);
    }
    if(k == 1){
        int answer = oo;
        for(int i = 1; i <= q; i ++){
            is_q[u2[i - 1]][v2[i - 1]] = 1;
            is_q[u2[i]][v2[i]] = 0;
            int now_ans = t2.spfa_2(1, n);
            answer = min(answer, now_ans);
        }
        printf("%d", answer);
    } 
    else{
        int ans_1 = t2.spfa_1(1, n);
        printf("%d", ans_1 == oo ? -1 : ans_1);
    }
    return 0;
}
/*
5 5 2 1
1 2 1
1 3 2
2 4 2
3 4 3
4 5 4
1 4 1
2 5 1
*/

秀秀 和哺 噜国 ( cut )

17.10.24   数据最水的一次考试
A + 35 + 0
 
题目描述
输入格式
输出格式
样例输入
样例输出
数据范围

#include<cstdio>
#include<cstdlib>
#define N 5555
#define M 786433
using namespace std;
typedef long long LL;
struct edge {
    int t,n;
} e[N*2];
LL h[N],size[N],f[N][N],g[N],cnt[N];
int n,K,tote;
void add(int u,int v) {
    e[++tote].t=v;
    e[tote].n=h[u];
    h[u]=tote;
    return ;
}
void dfs(int u,int fa) {
    size[u]++;
    f[u][1]=1;
    for (int i=h[u]; i; i=e[i].n) {
        int v=e[i].t;
        if (v==fa) continue;
        dfs(v,u);
        for (int j=1; j<=size[u]+size[v]; j++) g[j]=0;
        for (int j=1; j<=size[u]; j++) g[j]=cnt[v]*f[u][j]%M;
        for (int j=1; j<=size[u]; j++)
            for (int k=1; k<=size[v]; k++) g[j+k]=(g[j+k]+f[u][j]*f[v][k]%M)%M;
        for (int j=1; j<=size[u]+size[v]; j++) f[u][j]=g[j];
        size[u]+=size[v];
    }
    for (int i=K; i<=size[u]; i++) cnt[u]=(cnt[u]+f[u][i])%M;
    return ;
}
int main() {
    scanf("%d %d",&n,&K);
    for (int i=1; i<n; i++) {
        int u,v;
        scanf("%d %d",&u,&v);
        add(u,v);
        add(v,u);
    }
    dfs(1,1);
    printf("%d
",cnt[1]);
    fclose(stdin);
    fclose(stdout);
    return 0;
}