多测不清空求调
查看原帖
多测不清空求调
347589
Zelotz楼主2023/10/5 17:50

本地对拍当 T = 1的时候开多大都不出错,T = 3000的时候很小的都能错,能清空的所有变量都清空了,肉眼查错一下午了,求助。

#include <bits/stdc++.h>
using namespace std;
#define srand srand(time(NULL))
#define random(x) rand() % (x)
#define il inline
#define ptc putchar
#define reg register
#define mp make_pair
#define pb push_back
#define rer(i, l, r, a) R(i, l, r) read(a[i])
#define R(i, l, r) for (int i = l; i <= r; ++i)
#define debug puts("--------------------------------------------")
typedef long long ll;
typedef pair<int, int> PII;
namespace kunkun 
{
    template <typename T>
    il void read(T &x) 
    { 
       x = 0; T f = 1; char ch;
       while (!isdigit(ch = getchar())) f -= (ch == '-') << 1;
       while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch & 15), ch = getchar(); x *= f;
    }
    template <typename T, typename ...L>
    il void read(T &x, L &...y) {read(x); read(y...);}
    template <typename T>
    il void write(T x) 
    {
        if (x < 0) ptc('-'), x = -x;
        if (x > 9) write(x / 10);
        ptc(x % 10 + '0');
    }
    template <typename T, typename ...L>
    il void write(T &x, L &...y) {write(x), ptc(' '); write(y...);}
}
using namespace kunkun;
const int N = 5e5 + 5; // 记得更改
int n, m, l[N], r[N], x[N], y[N];
int low[N], dfn[N], idx, belong[N], num;
vector<PII> E[N];
bool vis[N];
stack <int> sk;
void tarjan(int x)
{
    low[x] = dfn[x] = ++idx;
    sk.push(x);
    vis[x] = 1;
    for (auto t : E[x])
    {
        int v = t.first;
        if (dfn[v])
        {
            if (vis[v]) low[x] = min(low[x], low[v]);
        }
        else
        {
            tarjan(v);
            if (vis[v]) low[x] = min(low[x], low[v]);
        }
    }
    if (low[x] == dfn[x])
    {
        int top; ++num;
        do
        {
            top = sk.top();
            vis[top] = 0; belong[top] = num;
            sk.pop();
        } while (top ^ x);
        
    }
}
vector <int> ans;
int ind[N], a[N];
void dfs(int x)
{
    if (vis[x]) return ;
    vis[x] = 1;
    for (auto t : E[x]) 
    {
        ans.pb(t.second);
        int v = t.first;
        if (vis[v]) continue;
        dfs(v);
    }
}
void solve()
{
    read(n, m);
    R(i, 1, m) l[i] = r[i] = x[i] = y[i] = a[i] = ind[i] = 0;
    R(i, 1, m)
    {
        read(l[i], x[i], r[i], y[i]);
        if (x[i] == 1 && y[i] == 2) E[l[i]].pb({r[i], i});
        else if (x[i] == 2 && y[i] == 1) E[r[i]].pb({l[i], i});
    } 
    R(i, 1, n) if (!dfn[i]) tarjan(i);
    memset(vis, 0, sizeof vis);
    R(i, 1, m) if (x[i] == 2 && y[i] == 2) ans.pb(i); //cout << "fsadf " << i << endl;
    R(i, 1, m)
    {  
        if (x[i] == 1 && y[i] == 2)
        {
            if (belong[l[i]] ^ belong[r[i]]) ++ind[belong[r[i]]];
        }
        if (x[i] == 2 && y[i] == 1)
        {
            if (belong[l[i]] ^ belong[r[i]]) ++ind[belong[l[i]]];
        }
    }
    R(i, 1, m)
    {
        if (x[i] != 2 || y[i] != 2) continue;
        if (!ind[belong[x[i]]]) dfs(l[i]); //cout << "fuck " << l[i] << endl;
        if (!ind[belong[y[i]]]) dfs(r[i]); //cout << "shit " << r[i] << endl;;
    }
    R(i, 1, n) if (!ind[belong[i]]) dfs(i);
    R(i, 1, m) if (x[i] == 1 && y[i] == 1) ans.pb(i);
    reverse(ans.begin(), ans.end());
    for (auto v : ans) a[l[v]] = x[v], a[r[v]] = y[v];
    int sum = 0;
    R(i, 1, n) sum += a[i];
    write(sum), ptc('\n');
    for (auto v : ans) write(v), ptc(' '); ptc('\n'); 
	ans.clear();
    idx = 0, num = 0;
    R(i, 0, n) belong[i] = 0, E[i].clear(), vis[i] = 0, low[i] = dfn[i] = a[i] = ind[i] = 0;
    while (sk.size()) sk.pop();
}
signed main() 
{
    int T = 1; 
    read(T); 
    while (T--) solve();
    return 0;
}

对拍的时候只输出答案不输出方案,在后面的时候正确答案会比我大 1,交上去test 7答案也是比我大1.

2023/10/5 17:50
加载中...